1、三菱FX 系列PLC 编程口通信协议总览三菱FX 系列PLC 编程口通信协议总览该协议实际上适用于PLC 编程端口以及 FX-232AW 模块的通信感谢网友visualboy 提供通讯格式命令 命令码 目标设备DEVICE READ CMD 0 X,Y,M,S,T,C,DDEVICE WRITE CMD 1 X,Y,M,S,T,C,DFORCE ON CMD 7 X,Y,M,S,T,CFORCE OFF CMD 8 X,Y,M,S,T,C传输格式: RS232C波特率: 9600bps奇偶: even校验: 累加方式和校验字符: ASCII16 进制代码ENQ 05H 请求ACK 06H PL
2、C 正确响应NAK 15H PLC 错误响应STX 02H 报文开始ETX 03H 报文结束帧格式STX CMD DATA . DATA ETX SUM(upper) SUM(lower)例子STX ,CMD ,ADDRESS, BYTES, ETX, SUM02H, 30H, 31H,30H,46H,36H, 30H,34H, 03H, 37H,34HSUM=CMD+.+ETX30h+31h+30h+46h+36h+30h+34h+03h=74h;累加和超过两位取低两位1 DEVICE READ 读出软设备状态值计算机向PLC 发送始 命令 首地址 位数 终 和校验STX CMD GROUP
3、 ADDRESS BYTES ETX SUM例子从D123 开始读取4 个字节数据02h 30h 31h,30h,46h,36h 30h,34h 03h 37h,34h地址算法:address=address*2+1000h再转换成ASCII31h,30h,46h,36hPLC 返回STX 1ST DATA 2ND DATA . LAST DATA ETX SUM注最多可以读取64 个字节的数据例子从指定的存储器单元读到3584 这个数据02h 33h 35h 38h 34h 03h 44h,36h2 DEVICE WRITE 向PLC 软设备写入值始 命令 首地址 位数 数据 终 和校验ST
4、X CMD GROUP ADDRESS BYTES 1ST DATA 2ND DATA . LAST DATA ETX SUM例子向D123 开始的两个存储器中写入1234,ABCD02h 31h 31h,30h,46h,36h 30h,34h 33h,34h,31h,32h,43h,44h,41h,42h 03h 34h,39hPLC 返回ACK (06H) 接受正确NAK (15H) 接受错误3 位设备强制置位/复位FORCE ON 置位始 命令 地址 终 和校验STX CMD ADDRESS ETX SUM02h 37h address 03h sumFORCE OFF 复位始 命令 地
5、址 终 和校验STX CMD ADDRESS ETX SUM02h 38h address 03h sumPLC 返回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 表示需要读取或者写
6、入的字节数2.地址算法上有说明3.累加和是从STX 后面一个字节开始累加到ETX 的和VB读写三菱FX系列PLC数据示例通过前面两篇文章,我们了解了三菱FX系列PLC的编程口通信协议。为了更方便读者学习这里提供一个用VB编写的示例,其中包含一个通用模块,如果你需要对此类PLC进行读写数据区的操作可以下载看看。三菱FX系列PLC的校验采用的是和校验,在写数据和读数据时都会有这个和校验,和校验用于检查数据包是否有错。因此我们必需知道和校验的算法,才能成功地进行通信。在这里我们提供了一个和校验的VB源代码: *Private Function Check_FCS(mStr As String) As
7、 StringDim K As Integer, mTest As IntegerFor K = 1 To Len(mStr)mTest = mTest + Asc(Mid(mStr, K, 1)NextCheck_FCS = Right(Hex(mTest), 2)End Function* 函数中的 mStr 参数为命令、位数、数据、终止符的合集,读取时不包括数据。使用Check_FCS函数时将返回和校验码。当向PLC写数据时,数据必须为四位的十六进制数,并且低位在前、高位在后。这里提供一个循环代码,将一个数组里的整数转换为向PLC写入数据的字符串: For Q = 0 To UBound
8、(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 - 1mData(Q) = &H & (Mid(myHex, 4 + Q * 4, 2) & Mid(myHex, 2 + Q * 4, 2)Next mCounts 为要读取数据区的个数,myHex 是串口返回来的数据,经过上面计算返回的整数值将排列在 mData 数组里。