1通讯原理与方法
上位机要能够通过PLC监控下层设备的状态,就要实现上位机与PLC间的通信,一般工业控制中都是采用RS
由于CPM
连接是通过OMRON提供的专用电缆CQM1-CIF01来实现的,其硬件连接图如图1所示。
2 PLC与计算机间的通信规约
计算机与PLC间的通信是以“帧”为单位进行的,并且在通信的过程中,计算机具有更高的优先级。首先,计算机向PLC发出命令帧,然后,PLC作出响应,向计算机发送回响应帧。其中命令帧和响应帧的格式如下:
(1) 命令帧格式。为了方便计算机和PLC的通讯,CPM
其中@放在首位,表示以@开始,设备号为上位机识别所连接的PLC的设备号。识别码为命令代码,用来设置用户希望上位机完成的操作,FCS为帧检验代码,一旦通信出错,通过计算FCS可以及时发现。结束符为“*”和CR回车符,表示命令结束。
(2) 响应帧格式。由PLC发出的对应于命令格式的响应帧格式如图3所示。
其中,异常码可以确定计算机发送的命令是否正确执行。其它的与正文中的含义相同。正文仅在有读出数据时有返回。
3 通信程序的设计
为了充分利用计算机数据处理的强大功能,我们可以采用计算机有优先权的方式,在计算机上编写程序来实现计算机与PLC的通信, 计算机向PLC发出命令发起通信,PLC自动返回响应。本文中采用VB来编写计算机与PLC间的通讯程序。在VB中提供了通信控件—应用通信控件(MSCOMM),实现通过串行端口传送和接受的功能。
下面介绍MSCOMM控件的属性:
*CommPort:设定通信连接端口代号,程序必须指定所要使用的串行端口号,Windows系统使用所设定的端口与外界通信。
*PortOpen:设定通信口状态,若为真,通信端口打开,否则关闭。
*Settings:设定通信口参数,其格式是"bbbb,p
,d,s",其中bbbb为通信速率(波特率),p为通信检查方式(奇偶校验), d 为数据位数,s为停止位数,其设定应与PLC的设定一致。
*Input:将对方传送至输入缓冲区的字符读入到程序。
*Output:将字符写入输出缓冲区。
*InBufferCount:传回接收缓冲区中的字符数。
*OutBufferCount:传回输出缓冲区中的字符数。
*InputLen:设定串行端口读入字符串的长度。
*InputMode:设定接收数据的方式。
*Rthreshold:设定引发接收事件的字符数。
*CommEvent:传回OnComm事件发生时的数值码
*OnComm事件:无论是错误或事件发生,都会触发此事件。
(1) 控件参数的初始化。
初始化程序如下:
Mscomm.ComPort=2 '使用串口Com2
Mscomm.Settings="9600, E, 7, 2" '波特率9600,偶校验,7位数据位,2位停止位
Mscomm.PortOpen=True '打开通信端口,准备通信
(2) 计算校验码FCS,计算FCS的VB自定义函数如下:
Function FCS(ByVal InputStr As String) As String
Dim Slen, i, Xorresult As Integer
Dim Tempfes As String
Slen=Len(InputStr) '求输入字符串长度
Xorresult = 0
For i = 1 To Slen
Xorresult = Xorresult Xor Asc(Mid$(InputStr, i, 1)) '按位异或
Next i
Tempfes=Hex$(Xorresult) '转化为16进制
If Len(Tempfes)=1Then Tempfes =“
FCS = Tempfes
End Function
(3) 计算机与PLC通信程序。
主要是一个自定义函数。
Function ReadData(ByVal InputStr As String, ByVal Num As Integer) As String
Dim OutputStr As String
Dim InString As String
Dim ReturnStr As String
Dim EndString As String
Dim FCSString As String
Dim ReturnFCSString As String)
MSComm.InBufferCount=0
OutputStr=InputStr+FCS(InputStr)+“*” '给出命令帧
MSComm.Output=OutputStr+Chr$(13) '向PLC传送命令帧
Do
DoEvents
Loop While MSComm.InBufferCount < 15
InString=MSComm.Input '获取PLC的响应帧
'结束码判断
EndString = Mid$(InString, Len(InString) -
Num- 5, 2)
If EndString = "13" Then
ReadData = "Error"
Exit Function
ElseIf EndString = "14" Then
ReadData = "Error"
Exit Function
ElseIf EndString = "15" Then
ReadData = "Error"
Exit Function
ElseIf EndString = "18" Then
ReadData = "Error"
Exit Function
ElseIf EndString = "A3" Then
ReadData = "Error"
Exit Function
ElseIf EndString = "A8" Then
ReadData = "Error"
Exit Function
End If
'响应帧校验
EndString = Mid$(InString, 1, Len(InString) - 4)
ReturnFCSString = Mid$(InString,Len(InString) - 3, 2)
FCSString = FCS(EndString)
If FCSString <> ReturnFCSString Then
ReadData = "Error"
Exit Function
End If
ReturnStr = Mid$(InString,
Len(InString) - Num - 3, Num)
ReadData = ReturnStr
End Function
从上面程序可以看到,计算机对PLC返回的响应帧要进行FCS校验,并利用异常码排除返回的异常数据,这样不但可以提高计算机获取信息的正确性,而且提高了计算机监控的实时性。
欢迎咨询企业内训,企业内训更具针对性,"对症下药"效果佳!