[西门子] 松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试

[复制链接]
查看13470 | 回复0 | 2024-2-26 14:22:54 | 显示全部楼层 |阅读模式

点击上方蓝字关注我们

正文

1、松下PLC使用COM0端口,RS232接线。电脑端使用USB转RS232串口线。

硬件接线,RS232接线:

电脑端串口线:     PLC侧COM0:

2 RXD 接收数据    SD 发送数据

3 TXD 发送数据    RD 接收数据

5 GND 信号地      SG 信号地

2、PLC侧参数设置:



站号:1;

通讯模式:MODBUS RTU;

速率(波特率):9600;

数据长度:8位;

奇偶校验:奇校验;

停止位:1

3、八方汇串口调试软件侧设置:



通讯参数设置和PLC要一致,设备地址就是需要通讯的PLC的站号,这里是01(PLC侧 NO.410站号 1)。

4、八方汇调试神器有一点需要注意的地方:显示的起始地址范围要包含读写寄存器地址的范围,否则,将会出现读写寄存器地址无法写入地址的情况。如下图:



图中①中的地址范围是从0开始,显示连续的8个地址。②中的地址范围是从0开始,读写1个地址。

那么我就可以在②的读写寄存器地址里输入任意的0-7的数字,但不能超过7,超过7就会报错。因为①中地址范围最大就是7。



输入7以内的数字,都可以正常输入。

但是,当输入7以上的数字时就会报错。这一点对这个软件需要特别注意。



如果需要更大的地址,只需把①中的显示范围包含②中需要填的地址,就可以正常在②中输入了。

5、在FP-XH的用户手册-通讯篇中,有关于PLC进行MODBUS通讯时的地址对照表





这张表里包含了读写不同类型地址时需要使用的功能码和对应地址。需要注意的是红色框里代码就是MODBUS通讯时的功能码,这里是以10进制列出的,应用的时候注意转换成16进制。例如:代码16是DT多字写入,用串口软件发报文时,功能码应转换成16进制,也就是10,十进制的16=十六进制的10

6、MODBUS 功能码及其含义



MODBUS  RTU 错误应答的规定:





松下FP-XH  PLC侧响应规则



下面进入重点,各个功能和地址读写操作的应用例子

7、读1个Y点的状态,如何用串口软件发送报文

如:读取PLC的Y6的状态

发送:01 01 00 06 00 01 1D CB

接收:01 01 01 01 90 48

下图是MODBUS RTU协议规定的报文数据格式



报文解读:

发送数据格式解读



图片中显示出了发送数据各个码占用的位数(每两位代表1个字节的数据长度=8bit),这里都是16进制。如上图,起始地址占用4个位。

起始码:3.5个字符以上时间的间隔。

地址码01:读取站号为1设备的数据。

功能码01:读的是线圈类型的数据。

起始地址00 06:读取数据的起始地址是6,类型是Y点。为什么是Y点,是因为上面的PLC地址对照表里规定的,线圈中0000-06DF对应Y0-Y109F,看下图红色框里。



读取个数00 01:读取数据的数量是1个。

校验码1D CB:   CRC检验的值。

停止码:3.5个字符以上时间的间隔。

接收数据格式解读



图片中显示出了接收数据各个码占用的位数(每两位代表1个字节的数据长度=8bit),这里都是16进制。如上图,返回数据占用2个位。

起始码:3.5个字符以上时间的间隔。

地址码01:返回站号为1设备的数据。

功能码01:返回的是线圈类型的数据。

读取个数01:返回数据的长度是1个字节。(读取个数这里的数字代表返回的数据长度,单位是字节。1个字节=8bit)。

返回数据01:返回的数据为H01,【因为返回1个字节的数据,所以这个数据存储在低8位中,因为读取数据的起始地址是Y6,返回的数据=H01=B00000001,所以Y6=bit0=1】

校验码90 48:   CRC检验的值。

停止码:3.5个字符以上时间的间隔。

即我们读取的1号站线圈类型,地址为Y6的线圈当前状态为ON。

8、读10个Y点的状态,如何用串口软件发送报文(连续多点线圈读取状态)

如果需要读取Y300-Y309一共10个点状态要怎么发送报文?

发送:01 01 01 E0 00 0A BC 07

接收:01 01 02 A4 00 C3 3C

发送前,串口软件地址设置,如下图:



发送后报文,如下图:



返回结果,如下图



PLC侧数据状态



串口软件显示状态与PLC监控状态一致。

报文解读:

发送数据格式解读



图片中显示出了发送数据各个码占用的位数(每两位代表1个字节的数据长度=8bit,每4位代表1个字的数据长度),这里都是16进制。

起始码:3.5个字符以上时间的间隔。

地址码01:读取站号为1设备的数据。

功能码01:读的是线圈类型的数据。

起始地址01 E0:读取数据的起始地址是Y300,类型是Y点。为什么是Y点,是因为下图的PLC地址对照表里规定的,线圈中0000-06DF对应Y0-Y109F,看下图红色框里。【为什么地址是01 E0,下面有详细解释地址对应的问题】(*注1)



读取个数00 0A:读取数据的数量是连续的10个,从Y300开始到Y30A。(这里是16进制,HA=K10)

校验码BC  07:   CRC检验的值。

停止码:3.5个字符以上时间的间隔。

接收数据格式解读



图片中显示出了接收数据各个码占用的位数(每两位代表1个字节的数据长度=8bit),这里都是16进制。

起始码:3.5个字符以上时间的间隔。

地址码01:返回站号为1设备的数据。

功能码01:返回的是线圈类型的数据。

读取个数02:返回数据的长度是2个字节(1个字节=8bit,2个字节=16bit=1个字)。

返回数据1  A4:返回的第一个数据是HA4。HA4=B10100100(H代表16进制,B代表2进制)

返回数据2  00:返回的第二个数据是H00。H00=B00000000

把返回数据1和返回数据2组合起来就是0000 0000 1010 0100(即bit2=Y302=1,bit5=Y305=1,bit7=Y307=1,这和上图串口软件中显示是一样的。)

MODBUS RTU 功能码01, 返回数据是按字节处理的,1个字=2个字节=16bit。上面返回2个字节,存放数据需要占用1个字,返回数据1存放在低8位中,返回数据2存放在高8位中。

假如返回4个字节,数据存放需要占用2个字,返回数据1存放在第一个字的低8位中,返回数据2存放在第一个字的高8位中;返回数据3存放在第二个字的低8位中,返回数据4存放在第二个字的高8位中。

当返回更多数据时,按此规律递推。

因此我们处理接收到的数据时,需要把1个字的高8位和低8位进行互换,再重新组合成1个字,才能得到我们真正需要的数据,因为MODBUS RTU返回数据协议格式就是低位在前高位在后,而一个正常的数据是高位在前低位在后,所以需要处理。例如上面接收到的数据(数据1和数据2合起来)为HA400=B1010 0100 0000 0000,很显然这不是我们需要的数据。这是因为对于2进制来说左侧是高位右侧是低位,从左往右排就是从高位往低位排列。因此我们需要把1个字的高低字节互换处理,得到的数据是H00A4=0000 0000 1010 0100这才是真实的数据。

校验码C3  3C:   CRC检验的值。

停止码:3.5个字符以上时间的间隔。

即我们读取的1号站线圈类型,起始地址为Y300连续读取10个数据,返回的数据为HA400=B1010 0100 0000 0000。

(*注1)下面开始解释地址对应的问题

需要读取数据的起始地址为Y300,为什么发送报文时的起始地址为01E0?



上表我们看到Y0-Y109F对应的BUS上的数据(16进制)为0000-06DF,即Y0对应0000,Y109F对应06DF。按照此表规定的规则,那么Y10对应0010,Y5F对应005F,Y90对应0090,Y9F对应009F;下面关键问题来了Y100对应多少?按照上面的规则我们很容易会说Y100对应0100,真是如此吗?正确的答案是Y100对应00A0。是不是出乎你的意外?

这是因为松下PLC的X/Y/R地址是16进制非连续排列的。Y的地址排列为Y0-YF,Y10-Y1F......Y90-Y9F这一段Y0-Y9F是连续排列的。那么按16进制排列9F后面的一个数应该是A0,但松下PLC的下一个起始地址是Y100,跳过了中间的一段(A0-FF)不是YA0!

继续往下排列Y100-Y19F又是连续排列的,但是从Y200开始又跳过了中间的一段(1A0-1FF),变成了Y200-Y29F。下面是Y300-Y39F,Y400-Y49F.......

即松下PLC地址每遇到9F(H9F=10进制159)数据地址就会跳段改变,也就是说从起始地址每隔160个数据(0-159一共160个),就会改变地址起始编号。那么按照此规则Y0-Y109F一共有多少个数据呢?答案:11*160=1760。这是因为,从Y0-Y109F,一共有11个地址段,每个地址段从对应的0开始到9F一共有160个数据,那么总数就是11*160=1760。

而上表中给出的PLC的Y地址对应的BUS地址却是连续排列的,从0000到06DF即十进制的0到1759,一共有1760个。把BUS地址和PLC地址一一对应起来,那么Y300就对应BUS的01E0。这就是上面问题的答案。

BUS地址在对应区间内都是连续排列的。

下面附上几张地址对应图,以方便理解。

这是X地址的对应BUS地址表,规则同上面的解释,图中只列出了部分数据。



这是Y地址的对应BUS地址表,规则同上面的解释,图中只列出了部分数据。



这是R地址的对应BUS地址表,规则同上面的解释,图中只列出了部分数据。

R地址对应的BUS地址是0800-27FF,这里要特别注意



这是DT地址的对应BUS地址表,规则同上面的解释,图中只列出了部分数据。

DT地址是按10进制连续排列的,对应的BUS地址也是连续排列的,这一点和X/Y/R不同需要注意。



9、读取1个R点线圈状态,读取R100地址的状态,已知R100=ON。读单个R点,功能码用H01,接收到的数据需要高低字节互换。

发送:01 01 08 A0 00 01 FF 88



接收:01 01 01 01 90 48



接收报文中的读取个数表示的是返回的字节数。如上图01表示返回1个字节。

10、读取多个R点线圈状态,读取R100到R10F,16个R线圈的状态,已知R100=ON,R108=ON,R10A=ON。读多个R点,功能码用H01,接收到的数据需要高低字节互换。

发送:01 01 08 A0 00 10 3F 84



接收:01 01 02 01 05 78 6F



接收报文中的读取个数表示的是返回的字节数。如上图02表示返回2个字节。

11、读取1个输入X点的状态,读取XF的状态,已知XF=ON。读单个X点,功能码用H02,接收到的数据需要高低字节互换。

发送:01 02 00 0F 00 01 89 C9



接收:01 02 01 01 60 48



接收报文中的读取个数表示的是返回的字节数。如上图01表示返回1个字节。

12、读取多个输入X点的状态,读取X0-XF,16个X的状态,已知XF=ON。读多个X点,功能码用H02,接收到的数据需要高低字节互换。

发送:01 02 00 00 00 10 79 C6



接收:01 02 02 00 80 B8 18



接收报文中的读取个数表示的是返回的字节数。如上图02表示返回2个字节。

13、读取1个DT的数据,读取DT66的数据,已知DT66=12580。读单个DT数据,功能码用H03,注意:H03功能码,返回的数据不需要进行高低字节互换,可以直接使用。每个返回数据存放占用1个字。

发送:01 03 00 42 00 01 24 1E



接收:01 03 02 31 24 AD CF



H3124=K12580

接收报文中的读取个数表示的是返回的字节数。如上图02表示返回2个字节。

14、读取多个DT的数据,读取DT66-DT75,连续10个的数据,已知DT66=12580,DT70=159,DT73=426。读多个DT数据,功能码用H03,注意:H03功能码,返回的数据不需要进行高低字节互换,可以直接使用。每个返回数据存放占用1个字。

发送:01 03 00 42 00 0A 65 D9



接收:01 03 14 31 24 00 00 00 00 00 00 00 9F 00 00 00 00 01 AA 00 00 00 00 75 6A







返回数据太多了,1张图截不完,按顺序看图就好了。

接收报文中的读取个数表示的是返回的字节数。如上图14表示返回20个字节。(H14=K20)

15、写1个Y点线圈,把Y400置1,单点写Y点,功能码用H05。正常时,接收的报文和发送的报文完全一样。写入的值为FF 00表示单个线圈置ON,这是规定的。

发送:01 05 02 80 FF 00 8C 6A



写入的值为FF 00表示单个线圈置ON,这是规定的。

接收:01 05 02 80 FF 00 8C 6A



16、写1个Y点线圈,把Y400置0,单点写Y点,功能码用H05。正常时,接收的报文和发送的报文完全一样。写入的值为00 00表示单个线圈置OFF,这是规定的。

发送:01 05 02 80 00 00 CD 9A



接收:01 05 02 80 00 00 CD 9A



**这里插入一下八方汇串口调试神器当需要写入数据时,要如何操作。

如:需要把一个线圈置ON,在八方汇串口调试神器上要怎么操作?

如下图需要把Y400置1,具体操作流程如下:

1. 填入地址,Y400对应BUS 16进制地址0280,Y400是起始位=bit0位

2. 鼠标左键单击bit0位,bit0位的显示状态就会从OFF变为ON

3. 点击红色框的发送

4.串口软件自动生成报文,并把报文发送出去。



当需要把1个线圈置OFF时,只需点击对应位,使其从ON变为OFF,再重复上面的步骤就可以了。

*注意2:  左上角选择16进制时,显示地址总个数/读写寄存器地址个数 在串口软件上用10进制表示,发送和接收的报文都是用16进制处理的!这里需要特别注意。



17、写多个Y点线圈,把Y400-Y40F一共16位全部置1,多点线圈写Y点,功能码用H0F。

发送:01 0F 02 80 00 10 02 FF FF DF 90



接收:01 0F 02 80 00 10 54 57



18、写多个Y点线圈,把Y400-Y410一共17位全部置0,多点线圈写Y点,功能码用H0F。

发送:01 0F 02 80 00 11 03 00 00 00 9C 64

接收:01 0F 02 80 00 11 95 97

19、写1个R点线圈,操作和Y地址的操作完全一样。发送和接收报文格式也完全一样。

20、写多个R点线圈,把R500-Y410一共17位全部置1,多点线圈写Y点,功能码用H0F。

发送:01 0F 0B 20 00 11 03 FF FF 01 4C 04



接收:01 0F 0B 20 00 11 96 29



21、写1个DT寄存器,把DT1444的值设定为8651。单点DT写入,功能码用H06。

功能码06,发送和接收报文一样。

发送:01 06 05 A4 21 CB 91 22



接收:01 06 05 A4 21 CB 91 22



22、写多个DT寄存器,把DT1444=61,DT1445=2613,DT1446=111。多点DT写入,功能码用H10。

发送:01 10 05 A4 00 03 06 00 3D 0A 35 00 6F 8E 24





上图中的要写入的个数代表写入多少个字,如上图0003代表写入3个字=6个字节。

接收:01 10 05 A4 00 03 C1 27



上图中的写入的个数代表写入多少个字,如上图0003代表写入3个字

23、提问:如果需要写入1个32 位的数据要怎么操作?

例如:在PLC的32位寄存器DT10中写入值120000,要怎么写?

1、先把十进制转成16进制,K120000=H0001D4C0。因为发送的时候数据是按字发送的,32位=2个字=4个字节,不足4个字节的高位补0。第一个字存放顺序为D4 C0高位在前低位在后,第二个字存放顺序为00 01高位在前低位在后。因此DT10中存放数据D4 C0,DT11中存放00 01。

2、发送多个字使用功能码H10

3、发送报文:01 10 00 0A 00 02 04 D4 C0 00 01 8B DC

   接收报文:01 10 00 0A 00 02 61 CA

THE END


以下资料免费领取,请主页赶快私信小编哦!





往期精彩回顾

致:一直在野蛮生长中的八方汇人
作为工程师,月薪8000以下的,你该点进来
《大型PLC编程智慧-核爆班》:非常⑥+①品牌升级计划

学习 VS 观望:当别人已经月薪过万、买房买车时,

你还在纠结吗?


八方汇工程师商学院
PLC项目开发,PLC编程培训


联系号:17190300606孙老师


点击下方“阅读原文”查看更多精彩内容☺

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则