PLC通讯协议: Siemens PPI协议

Siemens PPI协议分析


摘要:通过数据监视,分析的方法,找出了PPI协议的关键报文格式,可用于上位机、现场设备与S7-200 cpu之间通讯。
关键字:PLC ,PPI ,协议
1 前言
西门子S7-200 PLC之间或者PLC与PC之间通信有很多种方式:自由口,PPI方式,MPI方式,Profibus方式。使用自由口方式进行编程时,在上位机和PLC中都要编写数据通信程序。使用PPI协议进行通信时,PLC可以不用编程,而且可读写所有数据区,快捷方便。但是西门子公司没有公布PPI协议的格式。用户如果想使用PPI协议监控,必须购买其监控产品或第三方厂家的组态软件。这样给用户自主开发带来一定困难,特别是自行开发的现场设备就不能通过PPI协议接入PLC。其它通讯方式编程也存在编程复杂,需要购买软件和授权等局限性(1)。通过数据监视、分析的方法,我们找出了PPI协议的关键报文格式,可用于上位机、现场设备与S7-200 cpu之间通讯。
2 分析方法
西门子的Step 7 Micro/Win32 是用于S7-200系列PLC的开发工具,它使用PC机上的COM口通过一条PC/PPI编程电缆连到PLC的编程口上。这说明,PC实际上是可以通过串口同S7-200 cpu通讯。只是我们不知道通讯协议而已。通过截获PC机串口上的收发数据,对照Step 7软件发出的指令,我们就有可能分析出有关指令的报文和通讯方式;然后,直接通过串口向PLC发送报文,以验证这些指令报文是否正确。本着这一思想,我们采用以下步骤获得这些报文。
首先制作一个串口的分支器,COM1的RX、TX分别接到COM2的TX、RX,即交叉接线,使得COM1发的数据COM2能收到。PC/PPI编程电缆接在COM1上,这样,Step7 Micro/Win32发给PLC的报文就可以在COM2上接收了。我们按S7-200系统手册设置好两个串口,参数要一样,均为9600,8,偶校验,1位停止位。然后设置好Step7软件,使之能与S7-200 cpu正常通讯。从Step7软件中发出一个明确指令,COM2上的监视软件就能显示这条报文了(用16进制显示)。通过与Profibus标准的类比(2)我们就可以得到一些关键的报文了。这种方法比分析PLC中NETR,NETW指令要直接、全面(3)。
3 PPI协议分析
PC与PLC采用主从方式通讯,PC按如下的格式发读写指令,PLC作出接收正确的响应(返回应答数据E5H或F9H见下文分析),上位机接到此响应则发出确认命令(10 02 5C 5E 16),PLC再返回给上位机相应数据。
SD LE LEr SD DA SA FC DSAP SSAP DU FCS ED
SD:开始符(68H)
LE、Ler:长度(从DA到DU)
DA:目的地址
SA:源地址
FC:功能码 (6CH)
DSAP:目的服务存取点
SSAP:源服务存取点
DU:数据单元
FCS:校验和
ED:结束符(16H)
3.1 读命令分析

一次读一条数据

对于一次读取一个数据,读命令都是33个字节。前面的0—21字节是相同的,为:
68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10
因为是PC上发的读PLC数据的命令,SA=00,DA=02,如果有多个站,DA要改成相应的站号。读命令中从DA到DU的长度为1B即27个字节。从22字节开始根据读取数据的类型、位置不同而不同。表一是读不同存储器命令的Byte22—32。
字节2223242526272829303132
功能读取长度数据个数存储器类型存储器偏移量指针校验和结束
读q0.00100010000820000006416
读m0.00100010000830000006516
读M0.10100010000830000016616
读SMB34020001000005000110F916
读VB1000200010001840003208B16
读VW1000400010001840003208D16
读vd1000600010001840003208F16
读i0.50100010000810000056816
读i0.70100010000810000076A16
表一 读命令的Byte22-32

从表中我们可以得出以下结果:
Byte 22 读取数据的长度
01:1 Bit 02:1 Byte 04:1 Word 06:Double Word
Byte 24数据个数
这里是01 ,一次读多个数据时见下面的说明。
Byte 26 存储器类型
01:V存储器 00:其它
Byte 27 存储器类型
04:S 05:SM 06:AI 07:AQ 1E: C 81:I 82:Q
83:M 84:V 1F: T
Byte 28,29,30存储器偏移量指针(存储器地址*8),如:VB100,存储器地址为100,偏移量指针为800,转换成16进制就是320H,则Byte 28—29这三个字节就是:00 03 20。
Byte 31 校验和,前面已说到这是从(DA+SA+DSAP+SSAP+DU) Mod 256 。
一次读多条数据

对于一次读多个数据的情况,前21Byte与上面相似只是长度LD,LDr及Byte 14不同:
Byte 14 数据块占位字节,它指明数据块占用的字节数。与数据块数量有关,长度=4+数据块数*10,如:一条数据时为4+10=0E(H);同时读M,V,Q三个不同的数据块时为4+3*10=22(H)。
Byte 22 总是02 即以Byte为单位。
Byte 24 以字节为单位,连续读取的字节数。如读2个VD则Byte24=8
Byte 19---30 按上述一次读一个数据的格式依次列出,
Byte 31---42 另一类型的数据,也是按上述格式给出。
以此类推,一次最多读取222个字节的数据。

3.2 写命令分析
一次写一个Double Word类型的数据,写命令是40个字节,其余为38个字节。
一个Double Word类型的数据,前面的0—21字节为 :
68 23 23 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10
一个其它类型的数据,前面的0—21字节为:(与上面比较,只是长度字节发生变化)
68 21 21 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10
从22字节开始根据写入数据的值和位置不同而变化。表二是几个写命令的Byte22—40。

字节22232425262728293031323334353637383940

写入位置及值长度数据个数存储器类型存储器偏移量指针位数值、校验码、结束符
M0.0=10100010000830000000003000101007116
M0.0=00100010000830000000003000100007016
M0.1=10100010000830000010003000101007216
vb100=10020001000184000320000400081000AE16
vb100=FF02000100018400032000040008FF009D16
VW100=FFFF04000100018400032000040010FFFFA616
VD100=FFFFFFFF06000100018400032000040020FFFFFFFFB816
表二 写命令的Byte22—40

经分析我们可以得出以下结果:
Byte 22-- Byte 30 写入数据的长度、存储器类型、存储器偏移量与读命令相同。T,C等不能用写命令写入。
Byte 32 如果写入的是位数据这一字节为03,其它则为04
Byte 34 写入数据的位数
01: 1 Bit 08: 1 Byte 10H: 1 Word 20H: 1 Double Word
Byte 35--40值、校验码、结束符
如果写入的是位、字节数据,Byte35就是写入的值,Byte36=00,Byte37=检验码,Byte38=16H,结束。如果写个的是字数据(双字节),Byte35,Byte36就是写入的值, Byte37=检验码,Byte38=16H,结束。如果写个的是双字数据(四字节),Byte35—38就是写入的值, Byte39=检验码,Byte40=16H,结束。
3.3 其它命令分析
强制写入
I、Q、S 等不能使用上述的写命令写入数据,只能用强制写入的方式。
前0—35字节值如下(长度字段要根据实际情况而定),需要注意的是Byte8=07,
68 2B 2B 68 02 00 6C 32 07 00 00 00 00 00 0C 00 12 00 01 12 08 12 48 0B 00 00 00 00 00 FF 09 00 0E 00 01 10
后面的内容如下:
Byte 32 占位字节,从下一字节开始到校验和前的字节数。说明同读数据的Byte 14.
Byte 36 强制写入数据的长度
01:1 Bit 02:1 Byte
04:1 Word 06:Double Word
Byte 38 数据个数,这里是01 ,一次强制写多个数据时见下面的说明。
Byte 40 存储器类型
Byte 41 存储器类型,见读命令的说明。
Byte 42、43、44存储器偏移量指针(存储器地址*8)
Byte 45、46、47、48 值、校验码、结束符
取消强制写
强制写入I、Q 等后,这些值就不能被程序改变,除非使用”取消强制命令”。取消强制命令的格式与强制写入相似,变化的有以下几点:(1)是没有”值”这一段,即没有Byte45—48。这影响到长度字节LE,LEr;占位字节Byte 32.(2)Byte16=10H,(3) Byte32=0CH,也就是第一条,没有”值”这一段,数据块长度变短了。
对于一次强制写入或取消多个数据的情况可以参照写入命令写出相应的报文,这里不再给出。
STOP命令
STOP命令使得S7-200 cpu从RUN状态转换到STOP状态(此时cpu模块上的模式开关开应打在RUN或TERM位置)。PC发出如下命令,PLC返回F9,此时PLC已进入等待状态,PC再发确认报文(10 02 5C 5E 16),完成一个命令过程。
68 1D 1D 68 02 00 6C 32 01 00 00 00 00 00 10 00 00 29 00 00 00 00 00 09 50 5F 50 52 4F 47 52 41 4D AA 16
RUN 命令
RUN命令使得S7-200 cpu从STOP状态转换到RUN状态(此时cpu模块上的模式开关开应打在RUN或TERM位置)。PC发出下命令,PLC返回F9,此时PLC已进入运行状态,PC再发确认报文(10 02 5C 5E 16),完成一个命令过程。
68 21 21 68 02 00 6C 32 01 00 00 00 00 00 14 00 00 28 00 00 00 00 00 00 FD 00 00 09 50 5F 50 52 4F 47 52 41 4D AA 16
3.4 读出数据分析
一次读出一条数据
PLC响应的数据也是用PPI封装的。如果用一次读一条数据命令,响应的报文中就只包含一条数据,此响应报文的Byte16<=8。
Byte 04:DA=00 Byte 05:SA=02 即从02 PLC站发往PC。
Byte 16:数据块占位字节,从Byte21到校验和前的字节数。
一条数据时:Word=06 Double Word=08 其它为 05。
Byte 22:数据类型,位=3,其它=4。
Byte 24:数据宽度,Bit=01,Byte=08,Word=10H,Double Word=20H
Byte 25—28:值。
如果网络上只可能有一个站会发回响应报文,那么可以简单的根据LE长度字节判断返回值的位置:LE=16H,返回值是字节,或位类型的值,响应报文的Byte 25即是返回值;LE=17H,返回值是字(双字节)类型的值,响应报文的Byte 25,26即是返回值;LE=19H,返回值是双字(四字节)类型的值,响应报文的Byte 25—28即是返回值。更准确的方式是要根据返回报文的SA,DA,及存储器位置等信息识别目标地址和源地址,确认是这次申请的返回数据,然后经过校验检查,得到正确的数据。
一次读出多条数据
如果用的是一次读多条数据的命令,响应的报文中就包含有多条数据。这些数据只有类型参数,没有偏移量参数,所以要注意根据读命令的顺序将其一一对应起来。
Byte 16:数据块占位字节,从Byte21到校验和前的字节数,与数据块数量和类型有关。
Byte 20:数据块的个数。
Byte 21 开始为数据块,每一个数据块都以FF 04开始,接下来的两个字节表示这一数据块的长度,以位计算,然后依次是连续的数据。下一个数据块也是以FF 04开始,重复上述格式,直到结束。
4 应用
PC与与PLC通讯
在采用PC机与PLC通讯时,计算机采用PPI电缆或普通的485串口卡与PLC的编程口连接, PC机采用VB编程,遵循PPI协议,主从式的通讯方式,一次读写操作的步骤包括:首先上位机发出读写命令,PLC作出接收正确的响应(返回应答数据E5H),上位机接到此响应则发出确认命令(10 02 5C 5E 16),PLC完成正确的读写响应,返回给上位机相应数据。这样收发两次数据,完成一次数据的读写。那么我们就可以利用上述PPI协议,读写S7-200PLC中的各种类型数据,包括I、Q、SM、M、V、T、C、S等数据类型,能够直接读出以上变量中的位、字节、字、双字等,(其中读位变量时,实际是读取该位所在的字节值)。可以改变PLC的运行状态(RUN/STOP)。在编程时,最好将读取的检测值、输出值等数据,存放在PLC的一个连续的变量区中,当上位机读取PLC的数据时,就可以一次读出这组连续的数据,减少数据的分次频繁读取。当修改设定值等数据时,进行写数据的通讯操作。
现场设备与PLC通讯
利用PPI协议除了能与上位机(PC)通讯外,更重要的是为现场设备与S7-200cpu间的通讯提供了捷径。自行开发的设备可以方便的利用PPI协议通过485/232接口接入S7-200cpu,联入PLC的网络,包括控制面板,采集器等。
5 总结
通过分析STEP7 Micro/win32软件与S7-200cpu的通讯数据,我们得到了西门子PPI协议的关键报文格式,这一结果对工程实践具有较高的参考价值。在不使用西门子或其它组态软件的情况下,利用分析得到的PPI协议实现了上位机对PLC的监控。现场设备与PLC通讯方面的工作正在进行中。另外这种对通讯端口进行监测、分析的方法也对一些未知协议的测定和通讯错误的检查具有指导意义。


参考资料
1. 周晓平,姜建芳,苏少钰,陈迅. S7-200系列PLC与监控计算机通信实现的研究. 微计算机信息 2004;1.
2. SIEMENS. SIMATIC S7-200可编程序控制器 系统手册. 02 ed,2000.
3. 郝莉,王东兴. PROFIBUS从站与S7-200PLC的通讯研究. 北京机械工业学院学报(综合版) 2000;15


PPI通讯 VB程序例
rivate Declare Sub Sleep Lib "kernel32" (ByVal dwseconds As Long)
Private Sub Label3_Click()
End Sub

Private Sub Label9_Click()
End Sub
Private Sub Command1_Click()
Dim leixing As String
Dim xx As String
Dim ha As String
Dim dizhi As String
Dim str_read(0 To 32) As Byte
Dim i As Integer
Dim Temp_FCS As Variant
Dim str_val(0 To 5) As Byte
dizhi = Text2.Text
leixing = Text1.Text
If leixing = "s" Or leixing = "sm" Or leixing = "i" Or leixing = "q" Or leixing = "v" Or leixing = "vb" Or leixing = "vw" Or leixing = "vd" Then

If leixing = "s" Then
xx = &H4
ha = &H1
End If
If leixing = "sm" Then
xx = &H5
ha = &H1
End If
If leixing = "i" Then
xx = &H81
ha = &H1
End If
If leixing = "q" Then
xx = &H82
ha = &H1
End If
If leixing = "m" Then
xx = &H83
ha = &H1
End If
If leixing = "v" Then
xx = &H84
ha = &H1
End If
If leixing = "vb" Then
xx = &H84
ha = &H1
End If
If leixing = "vw" Then
xx = &H84
ha = &H2
End If
If leixing = "vd" Then
xx = &H84
ha = &H4
End If
str_read(0) = &H68
str_read(1) = &H1B
str_read(2) = &H1B
str_read(3) = &H68
str_read(4) = &H2
str_read(5) = &H0
str_read(6) = &H6C
str_read(7) = &H32
str_read(8) = &H1
str_read(9) = &H0
str_read(10) = &H0
str_read(11) = &H0
str_read(12) = &H0
str_read(13) = &H0
str_read(14) = &HE
str_read(15) = &H0
str_read(16) = &H0
str_read(17) = &H4
str_read(18) = &H1
str_read(19) = &H12
str_read(20) = &HA
str_read(21) = &H10
str_read(22) = &H2
str_read(23) = &H0
str_read(24) = ha
str_read(25) = &H0
str_read(26) = &H1
str_read(27) = xx
str_read(28) = &H0
str_read(29) = (Str(dizhi) * 8) // 256
str_read(30) = (Str(dizhi) * 8) Mod 256
For i = 4 To 30
Temp_FCS = Temp_FCS + str_read(i)
Next i
str_read(31) = Temp_FCS Mod 256
str_read(32) = &H16
MSComm1.Output = str_read
Text4.Text = ""
Sleep (50)
str_val(0) = &H10
str_val(1) = &H2
str_val(2) = &H0
str_val(3) = &H5C
str_val(4) = &H5E
str_val(5) = &H16
MSComm1.Output = str_val
Else:
If MsgBox("数据类型输入错误,正确类型为 S SM I Q M V VB VW VD",1 + 32 + 0,"关闭") = 1 Then

End If
End If
End Sub
Private Sub Command2_Click()
Unload Form4
End Sub
Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.Settings = "9600,e,8,1"
MSComm1.InputLen = 0
MSComm1.RThreshold = 28
MSComm1.InputMode = comInputModeBinary
MSComm1.PortOpen = True
End Sub
Private Sub MSComm1_OnComm()
Dim rcv_array() As Byte
Dim dis_array As String
Dim rcv_len As Long
Dim yy As String
Dim haha As String
rcv_array = MSComm1.Input
rcv_len = UBound(rcv_array)
ReDim temP(0 To UBound(rcv_array))
For i = 0 To rcv_len
dis_array = dis_array & Hex(rcv_array(i)) & ""
Next i
If Len(dis_array) = 38 Then
yy = Mid(dis_array,34,1)
End If
If Len(dis_array) = 39 Then
yy = Mid(dis_array,2)
End If
If Len(dis_array) = 42 Then
yy = Mid(dis_array,35,4)
End If
If Len(dis_array) = 45 Then
yy = Mid(dis_array,5)
End If
Text3.Text = Val("&H" & yy)
Text4.Text = dis_array
End Sub

西门子PPI通讯协议S7-200 PLC之PPI协议 通过硬件和软件侦听的方法,分析PLC内部固有的PPI通讯协议,然后上位机采用VB编程,遵循PPI通讯协议,读写PLC数据,实现人机操作任务。这种通讯方法,与一般的自由通讯协议相比,省略了PLC的通讯程序编写,只需编写上位机的通讯程序资源S7-226的编程口物理层为RS-485结构,SIEMENS提供MicroWin软件,采用的是PPI(Point to Point)协议,可以用来传输、调试PLC程序。在现场应用中,当需要PLC与上位机通讯时,较多的使用自定义协议与上位机通讯。在这种通讯方式中,需要编程者首先定义自己的自由通讯格式,在PLC中编写代码,利用中断方式控制通讯端口的数据收发。采用这种方式,PLC编程调试较为烦琐,占用PLC的软件中断和代码资源,而且当PLC的通讯口定义为自由通讯口时,PLC的编程软件无法对PLC进行监控,给PLC程序调试带来不便。SIEMENS S7-200PLC的编程通讯接口,内部固化的通讯协议为PPI协议,如果上位机遵循PPI协议来读写PLC,就可以省略编写PLC的通讯代码。如何获得PPI协议?可以在PLC的编程软件读写PLC数据时,利用第三个串口侦听PLC的通讯数据,或者利用软件方法截取已经打开且正在通讯的端口的数据,然后归纳总结,解析出PPI协议的数据读写报文。这样,上位机遵循PPI协议,就可以便利的读写PLC内部的数据,实现上位机的人机操作功能。软件设计系统中测控任务由SIEMENS S7-226PLC完成,PLC采用循环扫描方式工作,当定时时间到时,执行数据采集或PID控制任务,完成现场的信号控制。计算机的监控软件采用VB编制,利用MSComm控件完成串口数据通讯,通讯遵循的协议为PPI协议。PPI协议西门子的PPI(Point to Point)通讯协议采用主从式的通讯方式,一次读写操作的步骤包括:首先上位机发出读写命令,PLC作出接收正确的响应,上位机接到此响应则发出确认申请命令,PLC则完成正确的读写响应,回应给上位机数据。这样收发两次数据,完成一次数据的读写[5]。其通讯数据报文格式大致有以下几类:1、读写申请的数据格式如下:SD LE LER SD DA SA FC DASP SSAP DU FCS EDSD:(Start Delimiter)开始定界符(68H)LE:(Length)报文数据长度LER:(Repeated Length)重复数据长度SD: (Start Delimiter)开始定界符(68H)SA:(Source Address)源地址,指该地址的指针,为地址值乘以8DA:(Destination Address)目标地址,指该地址的指针,为地址值乘以8FC:(Function Code)功能码DSAP:(Destination Service Access Point)目的服务存取点SSAP:(Source Service Access Point)源服务存取点DU:(Data Unit)数据单元FCS:(Frame Check Sequence)校验码ED:(End Delimiter)结束分界符(16H)报文数据长度和重复数据长度为自DA至DU的数据长度,校验码为DA至DU数据的和校验,只取其中的末字节值。在读写PLC的变量数据中,读数据的功能码为 6CH,写数据的功能码为 7CH。2、PLC接收到读写命令,校验后正确,返回的数据格式为 E5H3、确认读写命令的数据格式为:SD SA DA FC FCS ED其中SD为起始符,为10HSA为数据源地址DA为目的地址FC为功能码,取5CHFCS为SA+DA+FC的和的末字节ED为结束符,取16HPPI协议的软件编制在采用上位机与PLC通讯时,上位机采用VB编程,计算机采用PPI电缆或普通的485串口卡与PLC的编程口连接,通讯系统采用主从结构,上位机遵循PPI协议格式,发出读写申请,PLC返回相应的数据。程序实现如下:1、串口初始化程序: MSComm1.CommPort = 1 MSComm1.Settings = "9600,1" MSComm1.InputLen = 0 MSComm1.RThreshold = 1MSComm1.InputMode = comInputModeBinaryPPI协议定义串口为以二进制形式收发数据,这样报文的通讯效率比ASCII码高。2、串口读取数据程序,以读取VB100数据单元为例:Dim Str_Read(0 To 32) ‘定义发送的数据为字节为元素的数组。Str_ Read (32) = &H16 ‘相应的数组元素赋值,按照以下格式:Str_ Read (29) = (100*8) / 256 ‘地址为指针值,先取高位地址指针Str_ Read (30) = (100*8) Mod 256 ‘取低位地址指针Str_ Read (24) = 1 ‘读取的数据长度(Byte的个数)For I=4 to 30 Temp_FCS = Temp_FCS + Str_Read(i)Next IStr_Read(31)= Temp_FCS Mod 256 ‘计算FCS校验码,其它数组元素赋值省略。68 1B 1B 68 2 0 6C 32 1 0 0 0 0 0 E 0 0 4 1 12 A 10 2 0 1 0 1 84 0 3 20 8B 16PLC返回数据 E5 后,确认读取命令,发送以下数据:10 2 0 5C 5E 16然后上位机VB程序接受到以下数据:68 16 16 68 0 2 8 32 3 0 0 0 0 0 2 0 5 0 0 4 1 FF 4 0 8 22 78 16首先识别目标地址和源地址,确认是这次申请的返回数据,然后经过校验检查,正确后解析出第26号数据(&H22)即为VB100字节的数据。3、串口写入数据程序,以写VB100数据单元为例:Dim Str_Write(0 To 37) ‘定义发送的数据为字节为元素的数组。Str_Write (37) = &H16 ‘相应的数组元素赋值,按照以下格式Str_Write (35) = &H10 ‘要写入的数据值68 20 20 68 2 0 7C 32 1 0 0 0 0 0 E 0 5 5 1 12 A 10 2 0 1 0 1 84 0 3 20 0 4 0 8 C B9 16PLC返回数据 E5 后,确认写入命令,发送以下数据:10 2 0 5C 5E 16然后上位机VB程序接受到以下数据:68 12 12 68 0 2 8 32 3 0 0 0 0 0 2 0 1 0 0 5 1 FF 47 16这是PLC正确接收并写入信息的返回数据。4、串口接收程序:在数据接收程序中,利用VB中MSComm控件,一次接收缓冲区中的全部数据,存放到数组形式的暂存单元中,然后分析每个元素的值,得到读写的数据。Dim RCV_Array() As ByteDim dis_Array As StringDim RCV_Len As LongRCV_Array = MSComm1.Input ‘取出串口接收缓冲器的数据。RCV_Len = UBound(RCV_Array)ReDim Temp(0 To UBound(RCV_Array))For i = 0 To RCV_Lendis_Array = dis_Array & Hex(RCV_Array (i)) & " "Next iText1.Text = dis_Array ‘接收到的数据送显示。在程序的读写过程中,一次最大可以读写222个字节,目前给出的数据读写为整数格式。数据类型 Str_ Read(27)S 04HSM 05HI 81HQ 82HM 83HV 84H以上程序,是以读写PLC的V变量区为例,利用PPI协议还可以读写S7-200PLC中的各种类型数据,包括I、Q、SM、M、V、T、C、S等数据类型,能够直接读出以上变量中的位、字节、字、双字等,其中读位变量时,是读取该位所在的字节值,然后上位机自动识别出该位的值。按照读写的数据类型,其中Str_ Read(27)的值各不同:在控制系统中,PLC与上位计算机的通讯,采用了PPI通讯协议,上位机每0.5秒循环读写一次PLC。PLC编程时,将要读取的检测值、输出值等数据,存放在PLC的一个连续的变量区中,当上位机读取PLC的数据时,就可以一次读出这组连续的数据,减少数据的分次频繁读取。当修改设定值等数据时,进行写数据的通讯操作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")