设为首页
收藏本站
PLC技术网
开启辅助访问
切换到宽版
登录
注册哦
只需一步,快速开始
微信扫码登录
门户
Portal
论坛
BBS
导读
Guide
排行榜
Ranklist
搜索
搜索
本版
文章
帖子
用户
PLC论坛-全力打造可编程控制器专业技术论坛
»
论坛
›
工控技术交流区
›
『国外:三菱/西门子/欧姆龙/松下』
›
松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试 ...
返回列表
发新帖
[西门子]
松下PLC做从站MODBUS RTU协议,八方汇串口调试神器调试
[复制链接]
13482
|
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
回复
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册哦
本版积分规则
发表回复
回帖后跳转到最后一页
wmy11
回复楼主
返回列表
『国外:三菱/西门子/欧姆龙/松下』
『国产:台达/汇川/信捷产品交流区』