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

来源:互联网 发布:java开发工程师前景 编辑:程序博客网 时间:2024/04/29 15:48

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

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

通讯格式

命令 命令码 目标设备

DEVICE READ CMD "0" X,Y,M,S,T,C,D

DEVICE WRITE CMD "1" X,Y,M,S,T,C,D

FORCE ON CMD " 7" X,Y,M,S,T,C

FORCE OFF CMD "8" X,Y,M,S,T,C

传输格式: RS232C

波特率: 9600bps

奇偶: even

校验: 累加方式和校验

字符: ASCII

16 进制代码

ENQ 05H 请求

ACK 06H PLC 正确响应

NAK 15H PLC 错误响应

STX 02H 报文开始

ETX 03H 报文结束

帧格式

STX CMD DATA ...... DATA ETX SUM(upper)SUM(lower)

例子

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,34h33h,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

(设备强制中的地址公式:Address=Address * 100h + (*) (必须为4位,不足4位前面补0)

 注:*号所代表值:

   C:14  M:8  T:6 Y:5  X:4  S:0

如对M2置位,则为地址为:2*256(100H)+8=0520 转为十六进制为:0208 再换为ASCII就是: 30 32 30 38)

 

说明

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

2.地址算法上有说明

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

VB读写三菱FX系列PLC数据示例

  通过前面两篇文章,我们了解了三菱FX系列PLC的编程口通信协议。为了更方便读者学习这里提供一个用VB编写的示例,其中包含一个通用模块,如果你需要对此类PLC进行读写数据区的操作可以下载看看。

三菱FX系列PLC的校验采用的是和校验,在写数据和读数据时都会有这个和校验,和校验用于检查数据包是否有错。因此我们必需知道和校验的算法,才能成功地进行通信。在这里我们提供了一个和校验的VB源代码:

'***************************************************

Private Function Check_FCS(mStr As String) AsString

 Dim K As Integer, mTest As Integer

 For K = 1 To Len(mStr)

  mTest = mTest + Asc(Mid(mStr, K, 1))

 Next

 Check_FCS = Right(Hex(mTest), 2)

End Function

'***************************************************

函数中的 mStr 参数为命令、位数、数据、终止符的合集,读取时不包括数据。使用Check_FCS函数时将返回和校验码。

当向PLC写数据时,数据必须为四位的十六进制数,并且低位在前、高位在后。这里提供一个循环代码,将一个数组里的整数转换为向PLC写入数据的字符串:

For Q = 0 To UBound(mData)

 myHex = myHex & Format(Hex(mData(Q) Mod &HFF),"00") & Format(Hex(mData(Q) \ &HFF), "00")

Next

在上面的代码中 mData 为向PLC写入数据的数组,myHex 最终得到的就是写入PLC时所要的数据字符串。同样的从PLC读出来的数据也是四位的十六进制,低位在前、高位在后。所以我们有必要将其转换为对应的整数。其主要的转换代码如下:

ReDim mData(mCounts - 1)

For Q = 0 To mCounts - 1

 mData(Q) = "&H" & (Mid(myHex, 4 + Q *4, 2) & Mid(myHex, 2 + Q * 4, 2))

Next

mCounts 为要读取数据区的个数,myHex 是串口返回来的数据,经过上面计算返回的整数值将排列在 mData 数组里。

0 0
原创粉丝点击