C#与PLC通信开发之三菱FX系列PLC

前言

本文讲解的是上位机如何与三菱FX系列PLC进行通信,开发语言使用的是C#语言,代码不多,主要是讲解通信协议。

刚做了一个转盘式翻斗分拣机项目,采用的是三菱PLC,之前没有接触过三菱的PLC,查看了一些资料,但是这些资料要么不完整,或者写的不够清楚,导致自己实际开发的时候,还是碰到一些问题,所以想花点时间总结一下,写一篇比较完整而且得到实际项目验证的文章记录下来。

简单介绍一下项目:项目的功能是按波次分拣订单,订单的特点是:每个订单的数量较多,商品的尺寸较小,大部分是胶带,小部分是很轻很薄的纸片式的商品,还有部分是比较大的比如记事本啊什么的。



分拣机由51个分拣口(含一个异常口),每个波次可以分拣50个订单,每个波次2000-3500件商品。由于商品的特殊性,没办法采用相机顶扫的方式,所以采用人工扫码,这台分拣机两个熟练的操作员操作的话,可以达到每秒1件商品的分拣速度,一小时能分拣3000多件商品,效率还是杠杠的。

好了,闲话少说,下面切入正题。

三菱FX系列PLC

通信接口

三菱FX系列PLC,采用串口与PC机进行通信,使用 SC-09 编程电缆作为计算机与 PLC 通信的连线。电缆的 9 芯 D 形插头连接在计算机串口上,另一端连接 PLC 的 RS-422 编程口。


FX-PLC


SC-09-DB9线

串口参数设置如下:

波特率:9600

奇偶校验:Even(偶校验)

数据位:7位

停止位:1位

串口参数设置好了以后,连接PLC,使用串口调试助手,按16进制发送05给PLC,如果连接正常的话,PLC会返回06。

通信协议

三菱FX系列PLC的通信协议有三个特点:

  1. 上位机(我们的PC机)和PLC之间的通信是应答式的,也就是说,上位机给PLC发送指令,PLC作出相应的应答,PLC不会主动给上位机发送任何指令。注意:每次给PLC发送指令后,必须等待PLC的应答完成才能发送下一条指令,否则下一条指令将会失败!
  2. 指令都是ASCII码的形式,而且都是十六进制的。比如你要往某个地址写入数值100,如果用二进制表示,那么只需要一个字节就行了,但是用ASCII码表示,就需要3个字节,在内存里面分别是:31H、30H、30H。整条指令,包括起始符、终止符、地址、值、校验都是使用ASCII码。
  3. 指令简单。除了上文所说的05H通信测试指令之外,还有另外4条指令:


我在项目中,主要用到的就是读写这两个指令,置位和复位这两个指令没有用到,不过下面将会逐一的讲解这4个指令(置位和复位这两个指令的内容从别人的文章里复制~)

校验

这4条指令都涉及到校验,所以在逐一讲解这4条指令之前,先说一下校验。三菱FX系列PLC的指令校验方式,采用的是和校验方式,也就是累加求和,然后取最后两位。很简单,直接上代码吧:

        public string CheckSum(byte[] cmd){byte sum = 0;for (int i = 0; i < cmd.Length; i++){sum = (byte)(sum + cmd[i]);}return sum.ToString("X2");}

地址

地址需要进行转换,转算算法为:

address = address*2 + 1000H

比如要往D134这个地址写入数据,那么地址为:

address = 134*2 + 4096

值得注意的是,FX系列PLC,读写的基本单元是字,也就是说每个地址对应的是两个字节,如图所示:

读指令

上位机指令

先来看看读指令的指令格式,一条完整的读指令,包含起始符(ASCII码里面的STX)、命令(30H)、首地址、读取的字节数、终止符(ASCII码里面的ETX)、校验这6个部分。下面的图示里,我们以读取首地址为D123为例,读取2个字节,也就是读一个short数据出来:

下面逐一讲解各个部分:

  • STX:起始符,ASCII码里面的STX,值为02H。一个字节。

  • CMD:指令,读指令为ASCII码的’0’,值为30H。一个字节。

  • 首地址:读取数据的起始地址,4个字节表示。地址的计算方式,上文有讲解,这个图里我们读取的是D123的地址,根据计算公式address=123*2 + 4096 = 10F6H,转换成ASCII码,就是31H,30H,46H,36H。

  • 字节数:要去读的字节数,2个字节表示。需要注意的是,一条读指令,最多能读取64个字节

  • ETX:指令终止符,ASCII码里面的ETX,值为03H。一个字节。

  • 校验:2个字节表示。校验在前面也讲解过,采用的是累加求和,取最后两个字节。从CMD到ETX这部分参与运算:

PLC响应

如果一切正常的话,那么PLC会对读指令进行响应,返回要读取的数据,我们假设PLC返回的short值是30,那么响应格式为:

基本上,PLC响应的各部分和指令是相同的。需要注意的是这个部分,我们的指令是读取2个字节,但是这个部分有4个字节,是因为FX系列通信协议里,指令和响应都是ASCII码表示的,每个字节用两个ASCII码字符表示,所以一共有4个字节。如果我们是按字读取值的话,也就是读取一个short的值,那么有两个地方需要注意:

  1. 字节顺序是:低位在前,高位在后,解析的时候需要调整顺序。
  2. 里面存储的是ASCII码,需要进行转换。

如何把这4个字节,还原成一个short呢?

首先,将31H45H30H30H,高低位调整顺序变成30H30H31H45H,然后把ASCII码转换成值001EH,也就是1*16 + 14 = 30。

其中,ASCII码转换成数值的代码如下:

        public static int AsciiToInt(byte ascVal){if (ascVal >= 0x30 && ascVal <= 0x39) // ASCII字符0-9之间{return (ascVal - 0x30);}else if (ascVal >= 0x41 && ascVal <= 0x46) // ASCII字符A-F之间{return (ascVal - 0x41 + 10);}else if (ascVal >= 0x61 && ascVal <= 0x66) // ASCII字符a-f之间{return (ascVal - 0x61 + 10);}else{return -1;}}

完整的转换一个short值的代码如下:

    public static short TranslateToShortValue(byte[] buf){int lowByte = AsciiToInt(buf[0]) * 16 + AsciiToInt(buf[1]);int highByte = AsciiToInt(buf[2]) * 16 + AsciiToInt(buf[3]);int intVal = highByte * 256 + lowByte;return (short)intVal;}

其中,buf数组里面,存储的就是从PLC里面读取的数据31H45H30H30H。

写指令

上位机指令

假设我们往地址D123里写入一个short值98(注意,不是16进制),指令格式为:


大体上和读指令的格式是一样的,只是有两个地方需要注意:

  1. 字节数:这里我们是按short类型写入,也就是写入一个字,所以字节数是2个。但是在数据部分,却占了4个字节,是因为指令全部由ASCII码组成。
  2. 数据部分:首先数值98要转换成16进制0063H,然后低位在前,高位在后,然后再转换成ASCII码。

PLC响应

写指令因为不需要返回数据,所以PLC的响应很简单,只返回一个字节。

  • 如果写入正确,则返回ACK(06H)
  • 如果写入错误,则返回NAK(15H)

完整的代码如下:

        private static string STX = "\x02";private static string ETX = "\x03";private SerialPort _serialPort;public bool WriteData(int addr, short value){if (null == _serialPort || !_serialPort.IsOpen){return false;}StringBuilder sb = new StringBuilder();sb.Append("1"); // CMDaddr = addr * 2 + 4096;sb.Append(addr.ToString("X4")); // 首地址sb.Append("02");    //字节数string strValue = value.ToString("X4"); // 数据sb.Append(strValue.Substring(2, 2));    // 低字节在先sb.Append(strValue.Substring(0, 2));    // 高字节在后sb.Append(ETX);   // 结束符// 计算SUMbyte[] cmd = System.Text.Encoding.ASCII.GetBytes(sb.ToString());string sum = CheckSum(cmd);sb.Append(sum); // SUMsb.Insert(0, STX);  // 插入起始符try{// 转换成字节并写入串口byte[] cmdArr = System.Text.Encoding.ASCII.GetBytes(sb.ToString());_serialPort.Write(cmdArr, 0, cmdArr.Length);}catch (System.ServiceProcess.TimeoutException ex){Logger.WriteLog("写入plc超时");return false;}catch (Exception ex){Logger.WriteLog("写入plc失败,异常:" + ex.Message);return false;}try{// 读取PLC响应int ret = _serialPort.ReadByte();if (ret == 6){// 正确应答return true;}}catch (System.ServiceProcess.TimeoutException ex){Logger.WriteLog("读取plc应答超时");}catch (InvalidOperationException ex){Logger.WriteLog("读取plc应答失败,串口未打开");}catch (Exception ex){Logger.WriteLog("读取plc应答失败,异常:" + ex.Message);}return false;}

置位指令

上位机指令


这里需要注意的就是:地址计算方式,address = address / 8 + 100H

PLC响应

PLC的响应很简单,只返回一个字节。

  • 如果写入正确,则返回ACK(06H)
  • 如果写入错误,则返回NAK(15H)

复位指令

上位机指令

这里需要注意的就是:地址计算方式,address = address / 8 + 100H

PLC响应

PLC的响应很简单,只返回一个字节。

  • 如果写入正确,则返回ACK(06H)
    是:地址计算方式,address = address / 8 + 100H

PLC响应

PLC的响应很简单,只返回一个字节。

  • 如果写入正确,则返回ACK(06H)
  • 如果写入错误,则返回NAK(15H)

复位指令

上位机指令

[外链图片转存中…(img-9eSEcDCT-1603044910210)]

这里需要注意的就是:地址计算方式,address = address / 8 + 100H

PLC响应

PLC的响应很简单,只返回一个字节。

  • 如果写入正确,则返回ACK(06H)
  • 如果写入错误,则返回NAK(15H)

C#与PLC通信开发之三菱FX系列PLC相关推荐

  1. PC与三菱FX系列PLC通信实例

    本文介绍的 PC 与三菱 FX 系列 PLC 通信,是通过 PLC 的编程口与 PC 机的串口进行的,采用 SC-09 编程电缆作为计算机与 PLC 通信的连线.电缆的 9 芯 D 形插头连接在计算机 ...

  2. 三菱je-a系列伺服支持modbusrtu 协议吗_入门课程 | 三菱FX系列PLC的软元件介绍

    点击箭头处"工业之家",选择"关注公众号"!  三菱FX系列PLC的软元件介绍 PLC的软元件很多,主要有输入继电器.输出继电器.定时器.计数器.数据寄存器和常 ...

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

    三菱FX 系列PLC 编程口通信协议总览 该协议实际上适用于PLC 编程端口以及 FX-232AW 模块的通信 通讯格式 命令 命令码 目标设备 DEVICE READ CMD "0&quo ...

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

    该协议实际上适用于PLC编程端口以及FX-232AW模块的通信 通讯格式       命令(CMD)   命令码    目标设备  DEVICE READ  CMD    "0"  ...

  5. plc和pc串口通讯接线_三菱FX系列PLC与电脑之间串口RS232通讯协议简易解析

    本文介绍的 PC 与三菱 FX 系列 PLC 通信,是通过 PLC 的编程口与 PC 机的串口进行的,采用 SC-09 编程电缆作为计算机与 PLC 通信的连线.电缆的 9 芯 D 形插头连接在计算机 ...

  6. C# SerialPort 读写三菱FX系列PLC

    1:串口初始化 com = new SerialPort("COM3", 9600, Parity.Even, 7, StopBits.One); 2:打开关闭串口 if (com ...

  7. 三菱FX系列PLC以太网连接力控ForceControl

    三菱FX系列PLC,包括FX1N.FX2N.FX3U.FX3S.FX3G等:可以通过MCTCP以太网连接力控软件ForceControl. 配置步骤: 1.新建IO设备,这里选择A.ANA系列以太网驱 ...

  8. 三菱FX系列PLC简单总结

    点击 三菱FX系列PLC简单总结 关注微信公众号:小平Linux工作室 获得"0基础学习PLC电气电工知识.数据结构与算法,STC89C51知识,嵌入式STM32.嵌入式Linux C/C+ ...

  9. 三菱FX系列PLC以太网通讯

    三菱FX系列PLC以太网通讯 BCBet-FX用于三菱FX1N/1S/2N/3U/3G/3S等系列PLC,以及汇川.禾川.士林等品牌PLC. BCBet-FX 以太网模块采用三通设计,不占用PLC通讯 ...

  10. 三菱FX系列PLC以太网连接kepwareopc软件

    三菱FX系列PLC,包括FX1N.FX2N.FX3U.FX3S.FX3G等:可以通过MCTCP以太网连接kepwareopc软件. 配置步骤: 1.新建channel,选择Mitsubishi Eth ...

最新文章

  1. python微控制器编程从零开始-单片机可以使用Python语言来控制了!
  2. 提示计算机未安装flash,大师应对安装了flash,但浏览器提示没安装,如何解决...
  3. windows桌面待办事项_有没有一款使用简单的电脑桌面待办事项提醒软件
  4. 使用 NVM 管理不同的 Node.js 版本
  5. Windows端口被占用处理方法
  6. 小米10解锁bl跳过168_2021年小米红米手机官方解锁BL详细教程+跳过168小时方法合集...
  7. 揭秘 | 双11逆天记录背后的数据库技术革新
  8. php 正则匹配 %3e,在shell脚本中使用正则表达式
  9. Kafka集群安装Version1.0.1(自带Zookeeper)
  10. lazarus控件怎么那么少_盘点5个常被搞混的控件与规范
  11. Javascript下拉刷新
  12. 【Hive】Hive的数据类型
  13. 5怎么用修改器_经常用电脑辐射大怎么办?这5个习惯防辐射,很多人都知道
  14. ffmpeg (三):ffmpeg结合SDL2.0解码音频流
  15. java继承和接口连接怎么用_继承与接口的使用
  16. 联想i5无线网无法连接服务器,联想笔记本无线网络连接不上是什么原因
  17. Web自动化测试:超详细的环境搭建步骤
  18. Rhino结合AD、keyshot进行建模和渲染
  19. 面试之springboot是什么?
  20. MeanTeacher论文学习笔记

热门文章

  1. 谁说变态才叫函数,带你了解不一样的表格函数
  2. bugku-秋名山老司机
  3. PS零基础学习教程(一)
  4. 京东618自动浏览叠蛋糕app
  5. 电脑版微信文件存储在哪个文件夹可以找到
  6. Toony Colors Pro 2项目分析——身体其他部位shader
  7. 最新PHP对接微信支付,发起商家转账API,商家转账到零钱
  8. 二级路由器设置为何要关闭DHCP服务
  9. Android开发所需要的矩阵知识
  10. Beyond Part Models: Person Retrieval with Refined Part Pooling 阅读笔记