搜档网
当前位置:搜档网 › vb与三菱PLC的通信详解

vb与三菱PLC的通信详解

vb与三菱PLC的通信详解
vb与三菱PLC的通信详解

Vb6.0与三菱PLC的通信

串行通信程序时,有两种方法,一种是用Windows API函数,另一种是用VB支持的通信控件MSCOMM.OCX。使用MSCOMM.OCX控件编程方便,具有更完善的发送和接收功能。这里采用了MSCOMM.OCX控件。

项目选用三菱FX2N-64MR型PLC,SC-09电缆作为计算机与PLC通信的连线。连接电缆的9针端连接在计算机串口上,另一端连接在PLC的RS-422编程口。

通信格式:

一个多字符帧由图1所示的五部分组成,其中和校验值是将命令码—ETX之间的字符的ASCII码(十六进制数)相加,取得所得和的最低二位数。STX(CHR(2))和ETX(CHR(3))分别表示该字符帧的起始标起和结束标志。

(1) 起始字元STX:ASCII码的起始字元STX对应的16进制数位0x02。无论命令信息还是回应信息,它们的起始字元均为STX,接收方以此来判知传输资料的开始。

(2) 命令号码:为两位16进制数。所谓命令号码是指上位机要求下位机所执行的动作类别,例如要求读取或写入单点状态、写入或读取暂存器资料、强制设定、运行、停止等。在回应信息中,下位机会将上位机接收到的命令号码原原本本的随同其它信息一同发送给上位机。

(3) 元件首地址:对应要操作的元件的相应的地址。如从D123单元中读取数据时,要把它对应的地址:0x10F6发送给PLC。

(4) 元件个数:一次读取位元件或字元件的数量。

(5) 结束字元(ETX):ASCII码的结束字元ETX对应的16进制数为0x03。无论命令信息还是回应信息,它们的结束字元均为ETX,接收方以此来判知此次通讯已结束。

(6) 校验码(Checksum):校验码是将STX-ETX之间的ASCII字元的16进制数值以“LRC(Longitudinal Redunda ncy Check)”法计算出1个Byte长度(两个16进制数值00-FFH)的校验码。当下位机接收到信息后,用同样的方法计算出接收信息的校验码,如果两个校验码相同,则说明传送正确。

FX2系列与计算机之间的通信是以主机发出的初始命令,PLC对其做出回答响应进行通信的,PLC无权命令。

三菱FX系列PLC编程口通信协议总览

该协议实际上适用于PLC编程端口以及 FX-232AW 模块的通信。通讯格式:

传输格式: RS232C波特率:9600bps奇偶even校验:累加方式(和校验)字符: ASCII16进制代码:

说明:1.帧中的BYTES表示需要读取或者写入的字节数。2.地址算法上有说明。3.累加和是从STX 后面一个字节开始累加到ETX的和。

三菱FX系列PLC编程口通信协议总览

例子:

STX ,CMD ,ADDRESS, BYTES, ETX, SUM

02H, 30H, 31H,30H,46H,36H, 30H,34H, 03H, 37H,34H

SUM=CMD+......+ETX;

30h+31h+30h+46h+36h+30h+34h+03h=74h;

累加和超过两位取低两位

1、DEVICE READ(读出软设备状态值)

计算机向PLC发送:

始命令首地址位数终和校验

STX CMD GROUP ADDRESS BYTES ETX SUM

例子:从D123开始读取4个字节数据

02h 30h 31h,30h,46h,36h 30h,34h 03h 37h,34h

地址算法:address=address*2+1000h

再转换成ASCII

31h,30h,46h,36h

PLC返回

STX 1ST DATA 2ND DATA ..... LAST DATA ETX SUM

注:最多可以读取64个字节的数据

例子:从指定的存储器单元读到3584这个数据

02h 33h 35h 38h 34h 03h 44h,36h

2、DEVICE WRITE(向PLC软设备写入值)

始命令首地址位数数据终和校验

STX CMD GROUP ADDRESS BYTES 1ST DATA 2ND DATA ...... LAST DATA ETX SUM

例子:向D123开始的两个存储器中写入1234,ABCD

02h 31h 31h,30h,46h,36h 30h,34h 33h,34h,31h,32h,43h,44h,41h,42h 03h 34h,39h

PLC返回

ACK (06H) 接受正确

NAK (15H) 接受错误

3、位设备强制置位/复位

FORCE ON置位

始命令地址终和校验

STX CMD ADDRESS ETX SUM

02h 37h address 03h sum

FORCE OFF复位

始命令地址终和校验

STX CMD ADDRESS ETX SUM

02h 38h address 03h sum

PLC返回

ACK(06H) 接受正确

NAK(15H) 接受错误

设备强制中的地址公式:Address=Address/8+100h

说明:

1.帧中的BYTES表示需要读取或者写入的字节数。

2.地址算法上有说明。

3.累加和是从STX后面一个字节开始累加到ETX的和。

三菱FX系列PLC编程口通信源代码

fx_comm.h

FX系列PLC四种通信模式的特性

首先讲讲FX系列PLC的通信方式。

FX系列PLC根据使用的通信模块与协议不同,分为以下四种通信模式:

1、PLC的N:N通信方式

2、PLC双机并联通信方式

3、PLC与计算机专有协议通信方式(无须梯形图,电脑直接读写操纵PLC)

4、PLC与计算机无协议通信方式(梯形图RS指令方式,可自定义通信协议)

以下将详细列出各通信模式的特性:

N:N网络 PLC并联专用协议计算机连接无协议通信

传输标准 RS485 RS485/RS422 RS485/RS422或RS232

传输距离 500m RS485/RS422:500mRS232:15m

连接数量 8站 1:1 1:N(N<=16) 1:1

通信方式半双工 FX,FX2c,FXon:半双工FX2n: 全双工

数据长度固定 7bit/8bit

校验无/奇/偶

停止位 1bit/2bit

波特率 38400bps 19200bps 300/600/1200/2400/4800/9600/19200

头字符固定无/有效

尾字符

控制线 ------

协议 --- 格式1/格式4 无

和校验固定无/有效

适用机型 FX2n,FXon FX2n,FX,FX2c FX2n,FXon,FX,FX2c

FX系列PLC专用协议通信指令一览

以下将详细列出PLC专用协议通信的指令:

指令注释

BR 以1点为单位,读出位元件的状态

WR 以16点为单位,读出位元件的状态,或以1字为单位,读出字元件的值

BW 以1点为单位,写入位元件的状态

WW 以16点为单位,写入位元件的状态,或以1字为单位,写入值到字元件

BT 以1点为单位,SET/RESET位元件

WT 以16点为单位,SET/RESET位元件,或写入值到字元件

RR 控制PLC运行RUN

RS 控制PLC停止STOP

PC 读出PLC设备类型

TT 连接测试

注:位元件包括X,Y,M,S以及T,C的线圈等;

字元件包括D,T,C,KnX,KnY,KnM等。

FX系列PLC专用协议通信指令格式详解

约定说明:

ENQ为请求标志,ASCII值5,VB中以chr(5)表示;

ACK为正确标志,ASCII值6,VB中以chr(6)表示;

STX为请求标志,ASCII值2,VB中以chr(2)表示;

EXT为请求标志,ASCII值3,VB中以chr(3)表示;

表格中红色字为需要求和效验的部分;

和效验为每一项的ASCII值的总和转换成十六进制后区低两位;

站号、PLC号、元件数量、和效验都是以十六进制表示;

等待延时为0-150毫秒,以十六进制0H-FH表示,如100ms为AH。

1、批量读出位元件--BR指令

格式:

1 2 3 4 5 6 7 8 15 16 17

PC侧: ENQ 站号 PLC号 BR 延时首地址数量和效验 ACK 站号 PLC号

PLC侧: STX 站号 PLC号数据 EXT 和效验

9 10 11 12 13 14

[注] 上述中:1、"PLC号"系统默认为"FF";2、"首地址 "应以十进制表示,如首地址"X0018"表示从X 寄存器的第18地址单元开始读取I/O量;3、"数量"表示读取的I/O量个数;4、"和效验"是指从"站号"到"数量"之间的各代码的ASCII码的累加和;5、PLC侧的响应码中"和效验"是指从"站号"到"EXT"之间的各代码的ASCII码的累加和。6、可以读出"X"、"Y"和"M"寄存器的内容。

例如:要读出站号为0的Fx2n系列PLC的X00到X08共9点的状态值,延时100ms,假设采用Communication Format(D8120)的Format 1 方式::

注释: 请求站号 PLC号命令延时元件首地址元件数量和效验

代码: ENQ 0 0 F F B R A X 0 0 0 0 0 9 4 2

ASCII码: 05H 30H 30H 46H 46H 42H 52H 41H 58H 30H 30H 30H 30H 30H 35H 34H 32H 您只要将以上兰色部分的代码以字符串形式(VB中可以表示为CHR(5)&" 00FFBRAX00000942")发送到PLC,就会有正确的回应信息,如下:

注释: 头站号 PLC号元件首地址尾和效验

代码: STX 0 0 F F 0 0 1 1 0 1 1 0 1 EXT 0 5

ASCII码: 02H 30H 30H 46H 46H 30H 30H 31H 31H 30H 31H 31H 30H 31H 03H 30H 35H 若发送码有误,则有以下回应:

注释: 头站号 PLC号和效验

代码: NAK 0 0 F F 0 6

ASCII码: 15H 30H 30H 46H 46H 30H 36H

2、批量读出字元件--WR指令

格式:

1 2 3 4 5 6 7 8 15 16 17

PC侧: ENQ 站号 PLC号 WR 延时首地址数量和效验 ACK 站号 PLC号

PLC侧: STX 站号 PLC号数据 EXT 和效验

9 10 11 12 13 14

该命令使用方法与1(BR)命令相同,不再赘述。

3、批量写入位元件--BW指令

格式:

1 2 3 4 5 6 7 8 9

PC侧: ENQ 站号 PLC号 BW 延时首地址数量写入值和效验

PLC侧: ACK 站号 PLC号

10 11 12

4、批量写入字元件--WW指令(M寄存器100单元置"1")

格式:01FFWWAM010********C

1 2 3 4 5 6 7 8 9

PC侧: ENQ 站号 PLC号 WW 延时首地址数量写入值和效验

PLC侧: 05H 01 FF A M0100 01 0001 0C ACK 站号 PLC号

10 11 12

一个例一:

在新建工程的表单上添加MSCOMM.OCX控件,初始化程序:

Private Sub Form_Load()

https://www.sodocs.net/doc/d910415091.html,mPort = 1 '选择COM1口

MSComm1.Settings = "9600,e,7,1"

End Sub

数据读取子程序:

Public Function GetData(ByVal StartAddress As String, ByVal GetBytes As Integer, ByVal Hex_Bytes As String) As String ‘定义读取子程序

MSComm1.InputLen = GetBytes * 2 + 4

MSComm1.Output = STX + CMD_Read + StartAddress + Hex_Bytes + ETX + GetSumChk(CMD_Read + StartAddress + Hex_Bytes + ETX) ‘传送数据组成:起始符+命令+首地址+数据位+结束符+和检验码

GetData = MSComm1.Input

MSComm1.InBufferCount = 0

MSComm1.InputLen = 0

End Function

如需读取数据,通过调用GetData子程序。参数设置程序可参考读取子程序,只是改变命令而已。

Access97数据库中包含三个表单,包括参数表、记录表、报警记录表。

通过如下子程序是将实际称量值(记录表)更新到数据库:

Private Sub SaveData()

Dim i As Integer

Dim valid As Boolean

On Error Resume Next

valid = True

Data1.Recordset.AddNew

Data1.Recordset.Fields("dtime") = TimeSerial(OnHour, OnMinute, OnSecond)

Data1.Recordset.Fields("systime") = Time ‘系统时间

Data1.Recordset.Fields("get_xl") = LF(1) ‘小料当前称量值

Data1.Recordset.Fields("get_fjs") = LF(2) ‘方解石当前称量值

Data1.Recordset.Fields("get_cs") = LF(3) ‘长石当前称量值

Data1.Recordset.Fields("get_sys") = LF(4) ‘石英砂当前称量值

Data1.Recordset.Fields("get_cj") = LF(5) ‘纯碱当前称量值

On Error Resume Next

Data1.Recordset.Update ‘更新数据库记录

Data1.Recordset.MovePrevious

End Sub

程序中,LF(i)变量对应为图二系统参数表单中实称值。

保存参数子程序只是对数据库操作,程序结构可参考以上子程序。

上位机与PLC通信质量的好坏,对系统的安全可靠运行影响极大,因此,编写程序时,除了在两者之间的通信协议上保持绝对一致和采取相应的容错技术外,还要考虑系统的整体容错技术,防止系统的不正常。

VB与PLC通信程序(欧姆龙PLC)

1)初始化程序

https://www.sodocs.net/doc/d910415091.html,mport=2 ’ 选择COM2

Mscomm1.Settings=”9600,N,8,2”’ 设置通信参数

Mscomm1.Inputlen=0 ’ 读入接收缓冲区全部字符

Mscomm1.OutbufferSize=256 ’ 设置发送缓冲区大小

Mscomm1.InbufferSize=512 ’ 设置接收缓冲区大小

Mscomm1.PortOpen=True ’打开COM2

2)发送命令程序

比如读取节点号03的PLC中IR000到IR009的内容,并放到tag1字符串变量中,此时有:

Dim Command, node, begin, number as string

Dim Answerlen as integer

node=”03”’节点号

Command=”RR”’命令为读IR区

begin=”0000”’从IR000开始

number=10 ’读取长度

Answerlen=51 ’计算接收字符串长度

进行命令发送和接收应答处理:

Dim FCS, I as integer

Dim s ,f as string

s=”@”+node+C ommad+begin+number

FCS=0

For i=1 to Len(s)

FCS=FCS xor Asc(Mid$(s,i,1) ) ’帧校验码FCS

Next i

f=Hex$(FCS)

If Len(f)=1 Then f=”0”+f

Commfrm.MSComm1.Output=s + f + ”*” + CHR$(13)’命令帧发送

Do

Dummy=DoEvents()

Loop Untill Commfrm.MSComm1.InbufferCount >= Answerlen ’等待应答帧

Do tag1= Commfrm.MSComm1.Input

Loop Untill Commfrm.MSComm1.InbufferCount=0 ’读完应答帧

上述程序具有相当的通用性,对于其它设备不同的只是各自的数据帧格式,因而只需做相应少量修改即可。

下面介绍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/d910415091.html,Port=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 =“0” 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校验,并利用异常码排除返回的异常数据,这样不但可以提高计算机获取信息的正确性,而且提高了计算机监控的实时性。

三菱FX系列PLC编程线自制方法:

我测试过,避免带电插拔串口!

PC RS232PLC

TXD(3)----------------------- RX —(1)

GND(5)------------------------ RX + (2)

|

|-----TX + (7)RXD(2)----------------------- TX —(4)7 8短接

4 6短接

相关主题