搜档网
当前位置:搜档网 › 上位机VB实现与三菱PLC的串行通讯

上位机VB实现与三菱PLC的串行通讯

上位机VB实现与三菱PLC的串行通讯
上位机VB实现与三菱PLC的串行通讯

上位机V B实现与三菱P L C的串行通讯

Document serial number【KK89K-LLS98YT-SS8CB-SSUT-SST108】

上位机V B实现与三菱P L C的串行通讯

2009年12月15日星期二下午07:40

1.通行原理与方法

上位机要能够通过PLC监控下层设备的状态,就要实现上位机与PLC间的通信,一般工业控制中都是采用RS232

C实现。上位机首先向PLC发送查询数据的指令(实际上是查询PLC中端子的状态和DM区的值等),PLC接收了上

位的指令后,进行校验(FCS校验码),看其是否正确,如果正确,则向上位机传送数据(包含首尾校验字节)。否

则,PLC拒绝向上位机传送数据。上位接收到PLC传送的数据,也要判断正确与否,如果正确,则接收,否则,

拒绝接收。

由于CPM1A没有提供串行通信口,我们利用其提供的外设端口实现通信。PLC与计算机之间的

连接是通过OMRON提供的专用电缆CQM1-CIF01来实现的,其硬件连接图如图1所示。(见附图)

2.??PLC与计算机间的通信规约

计算机与PLC间的通信是以“帧”为单位进行的,并且在通信的过程中,计算机具有更高的优先级。首先,计算

机向PLC发出命令帧,然后,PLC作出响应,向计算机发送回响应帧。其中命令帧和响应帧的格式如下:

(1)命令帧格式。为了方便计算机和PLC的通讯,CPM1A对在计算机连接通信中交换的命令和响应规定了相应的

格式。当计算机发送一个命令时,命令数据主准备格式如图2所示。(见附图)

其中@放在首位,表示以@开始,设备号为上位机识别所连接的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)控件参数的初始化。

初始化程序如下:

https://www.sodocs.net/doc/ef5161234.html,Port=2'使用串口Com2

Mscomm.Settings="9600,E,7,2"'波特率9600,偶校验,7位数据位,2位停止位

Mscomm.PortOpen=True'打开通信端口,准备通信

(2)计算校验码FCS,计算FCS的VB自定义函数如下:

FunctionFCS(ByValInputStrAsString)AsString

DimSlen,i,XorresultAsInteger

DimTempfesAsString

Slen=Len(InputStr)??'求输入字符串长度

Xorresult=0

Fori=1ToSlen

Xorresult=XorresultXorAsc(Mid$(InputStr,i,1))???'按位异或

Nexti

Tempfes=Hex$(Xorresult)???'转化为16进制

IfLen(Tempfes)=1ThenTempfes=“0”+Tempfes

FCS=Tempfes

EndFunction

(3)计算机与PLC通信程序。

主要是一个自定义函数。

FunctionReadData(ByValInputStrAsString,ByValNumAsInteger)AsString DimOutputStrAsString

DimInStringAsString

DimReturnStrAsString

DimEndStringAsString

DimFCSStringAsString

DimReturnFCSStringAsString)

MSComm.InBufferCount=0

OutputStr=InputStr+FCS(InputStr)+“*”'给出命令帧

MSComm.Output=OutputStr+Chr$(13)??'向PLC传送命令帧

Do

DoEvents

LoopWhileMSComm.InBufferCount<15

InString=MSComm.Input'获取PLC的响应帧

'结束码判断

EndString=Mid$(InString,Len(InString)-

??Num-5,2)

IfEndString="13"Then

???ReadData="Error"

???ExitFunction

ElseIfEndString="14"Then

???ReadData="Error"

???ExitFunction

ElseIfEndString="15"Then

???ReadData="Error"

???ExitFunction

ElseIfEndString="18"Then

???ReadData="Error"

???ExitFunction

ElseIfEndString="A3"Then

???ReadData="Error"

???ExitFunction

ElseIfEndString="A8"Then

???ReadData="Error"

???ExitFunction

EndIf

'响应帧校验

EndString=Mid$(InString,1,Len(InString)-4)

ReturnFCSString=Mid$(InString,Len(InString)-???3,2)

FCSString=FCS(EndString)

IfFCSString<>ReturnFCSStringThen

???ReadData="Error"

???ExitFunction

EndIf

ReturnStr=Mid$(InString,?

??Len(InString)-Num-3,Num)

ReadData=ReturnStr

EndFunction

从上面程序可以看到,计算机对PLC返回的响应帧要进行FCS校验,并利用异常码排除返回的异常数据,这样不但可以提高计算机获取信息的正确性,而且提高了计算机监控的实时性

相关主题