25 MODBUS RTU指令
编号 指令名 参数1 参数2 参数3 参数4 参数5 说明
1 modbusrtum K K Sn MODBUS RTU主初始化指令
2 modbusrtumrw K K K Dn K MODBUS RTU主读写指令
Dn Dn Dn Dn Dn
3 modbusrtuc K K K Sn MODBUS RTU从初始化指令
4 modbusrtuclose MODBUS RTU关闭指令
1 modbusrtum为MODBUS RTU主初始化指令:
参数1为串口编号,取值0或者2;
参数2为串口波特率;
参数3,当串口数据接收完成时会置位Sn;
例: modbusrtum 0 115200 s0 //初始化串口0,波特率为115200
2 modbusrtumrw为MODBUS RTU主读写指令:
参数1为从机的PLC NO号,取值1-255;
参数2为功能码,支持1,3,5,6,16这几个功能码;
参数3为从设备的寄存器地址;
参数4根据功能码的不同,当为读时,Dn保存读的数据,当为写时,Dn为要写
的数据;
参数5,为要读写的数据长度,注意modbus一个数据长度有2个字节;但是在功
能码1时,数据长度单位是位;
例: mov 65280 d0 //d0存入65280(16进制FF00),使用功能码5置位输出口时,
//必须写65280
modbusrtumrw 1 5 16 d0 1 //1为从机PLC站号,5为位写功能码,16
//为位地址即Y0,D0=65280,表示把Y0置1;最
//后的1在功能码为5时不起作用,写个1就可以了
mov 0 d0 //d0存入0,使用功能码5复位输出口就写0
modbusrtumrw 1 5 16 d0 1 //1为从机PLC站号,5为位写功能码,16
//为位地址即Y0,D0=0,表示把Y0清0;最后的
//1在功能码为5时不起作用,写个1就可以了
modbusrtumrw 1 1 0 d0 11 //从机站号1,功能码1,读取地址0,读
//取到D0寄存器,共读取11位;这样就把X0-10
//一次性全部读取 到D0中,D0的第0-10位依次是
//输入口X0-10的电平值。
modbusrtumrw 1 1 16 d1 13 //从机站号1,功能码1,读取地址16,读
//取到D1寄存器,共读取13位;这样就把Y0-12一次
//性全部读取到D1中,D1的第0-12位依次是输出口
//Y0-10的电平值。
modbusrtumrw 1 3 100 d1 2 //从机站号1,功能码3,读取地址100,读
//取到D1寄存器,长度为2,即读取4个字节,实际
//就是读取D50的值到D1中;
modbusrtumrw 1 16 100 d1 2 //从机站号1,功能码16,写入地址100,
//写入数据为D1寄存器,长度为2,即读取4个字节, //实际就是把D1的值写到D50中;
modbusrtumrw 1 6 100 d1 1 //从机站号1,功能码6,写入地址100,写
//入数据为D1寄存器,长度固定为1。实际就是把D1 //的低2字节值写到D50中;
3 modbusrtuc为MODBUS RTU从初始化指令:
参数1为从PLC NO号,取值1-255;
参数2为串口编号,取值0或者2;
参数3为串口波特率;
参数4,当串口数据接收完成时会置位Sn;
例: modbusrtuc 0 115200 s0 //初始化串口0,波特率为115200
4 modbusrtuclose为MODBUS RTU关闭指令:
下表列出了IO口及Dn数据寄存器对应的地址及功能码:
IO口 |
操作 |
触摸屏对应地址 |
PLC对应地址 |
功能码 |
|
位读 |
位写 |
||||
X0 |
只读 |
0x1 |
0 |
1 |
|
X1 |
只读 |
0x2 |
1 |
1 |
|
X2 |
只读 |
0x3 |
2 |
1 |
|
X3 |
只读 |
0x4 |
3 |
1 |
|
X4 |
只读 |
0x5 |
4 |
1 |
|
X5 |
只读 |
0x6 |
5 |
1 |
|
X6 |
只读 |
0x7 |
6 |
1 |
|
X7 |
只读 |
0x8 |
7 |
1 |
|
X8 |
只读 |
0x9 |
8 |
1 |
|
X9 |
只读 |
0x10 |
9 |
1 |
|
X10 |
只读 |
0x11 |
10 |
1 |
|
Y0 |
可读写 |
0x17 |
16 |
1 |
5 |
Y1 |
可读写 |
0x18 |
17 |
1 |
5 |
Y2 |
可读写 |
0x19 |
18 |
1 |
5 |
Y3 |
可读写 |
0x20 |
19 |
1 |
5 |
Y4 |
可读写 |
0x21 |
20 |
1 |
5 |
Y5 |
可读写 |
0x22 |
21 |
1 |
5 |
Y6 |
可读写 |
0x23 |
22 |
1 |
5 |
Y7 |
可读写 |
0x24 |
23 |
1 |
5 |
Y8 |
可读写 |
0x25 |
24 |
1 |
5 |
Y9 |
可读写 |
0x26 |
25 |
1 |
5 |
Y10 |
可读写 |
0x27 |
26 |
1 |
5 |
Y11 |
可读写 |
0x28 |
27 |
1 |
5 |
Y12 |
可读写 |
0x29 |
28 |
1 |
5 |
M0 |
可读写 |
0x33 |
32 |
1 |
5 |
M1 |
可读写 |
0x34 |
33 |
1 |
5 |
... |
... |
... |
... |
... |
... |
M198 |
可读写 |
0x231 |
230 |
1 |
5 |
M199 |
可读写 |
0x232 |
231 |
1 |
5 |
表4 IO口的地址及对应功能码
注:X0-10是输入口,使用功能码1读取;Y0-12是输出口,M0-M199是中间寄
存器,使用功能码1读取,功能码5写;触摸屏对应地址目前是按威纶触摸屏对应;
PLC对应地址是实际通讯时的数据值,比如我们用串口助手调试的时候用这个地址
值。
功能码5一次只能置位或清零一个输出口;功能码1可以一次读取多个输入或输出口
Dn数据寄存器 |
操作 |
触摸屏对应地址 |
PLC对应地址 |
功能码 |
||
多寄存器读 |
多寄存器写 |
单寄存器写(2字节) |
||||
D0 |
可读写 |
4x1 |
0 |
3 |
16 |
6 |
D1 |
可读写 |
4x3 |
2 |
3 |
16 |
6 |
D2 |
可读写 |
4x5 |
4 |
3 |
16 |
6 |
D3 |
可读写 |
4x7 |
6 |
3 |
16 |
6 |
...... |
可读写 |
...... |
...... |
3 |
16 |
6 |
D997 |
可读写 |
4x1995 |
1994 |
3 |
16 |
6 |
D998 |
可读写 |
4x1997 |
1996 |
3 |
16 |
6 |
D999 |
可读写 |
4x1999 |
1998 |
3 |
16 |
6 |
表5 Dn数据寄存器的地址即对应可读写功能码
Dn数据寄存器 |
操作 |
触摸屏对应地址 |
PLC对应地址 |
功能码 |
多寄存器读 |
||||
D0 |
只读 |
3x1 |
0 |
4 |
D1 |
只读 |
3x3 |
2 |
4 |
D2 |
只读 |
3x5 |
4 |
4 |
D3 |
只读 |
3x7 |
6 |
4 |
...... |
只读 |
...... |
...... |
4 |
D997 |
只读 |
3x1995 |
1994 |
4 |
D998 |
只读 |
3x1997 |
1996 |
4 |
D999 |
只读 |
3x1999 |
1998 |
4 |
表6 Dn数据寄存器的地址即对应只读功能码
注:modbus通讯协议规定每个地址占2个字节。因为1个Dn数据寄存器是4个
字节,所以1个Dn数据寄存器占用2个地址。比如D0占用PLC地址是0,1;D1占用
2,3;D999占用1998,1999
26 EEPROM指令
编号 指令名 参数1 参数2 参数3 说明
1 eepromread K Dn K EEPROM 读指令
Dn Dn Dn
K Fn K
Dn Fn Dn
2 eepromwrite K Dn K EEPROM 写指令
Dn Dn Dn
K Fn K
Dn Fn Dn
EEPROM地址范围0--4095,最大4096个字节;EEPROM写是有寿命的,所以尽量少频繁的写。
1 eepromread为EEPROM 读指令:
参数1为要读取的地址,取值0--4095;
参数2为寄存器地址起始地址,读取的值保存在从此寄存器开始的地址;
参数3为要读取的数据长度,单位字节;
例: eepromread 0 d200 4 //从地址0开始读取4个字节保存到D200寄存器中,
//如果,地址0,1,2,3开始依次保存的是1,2,3,4,那么D200
//中从低到高字节依次是1,2,3,4,所以D200为16进制的值
//是4030201,10进制的值是67305985
2 eepromwrite为EEPROM 写指令:
参数1为要写的地址,取值0--4095;
参数2为寄存器地址起始地址,要写的值放在从此寄存器开始的地址;
参数3为要写的数据长度,单位字节;
例: eepromwrite 0 d200 4 //把D200寄存器中的值,从地址0开始,共写4个字节
27 PID指令
编号 指令名 参数1 参数2 参数3 参数4 参数5 说明
1 pidinit K Fn Fn Fn Fn PID初始化指令
2 pidrun K Fn Fn Fn PID运算指令
3 pidreset K PID复位指令
1 pidinit为PID初始化指令:
参数1为序列号,取值0--9,总共10个PID运算;
参数2为PID参数Kp;
参数3为PID参数Ki;
参数4为PID参数Kd;
参数5为PID参数更新周期T,单位秒;
2 pidrun为PID运算指令:
参数1为序列号,取值0--9,总共10个PID运算;
参数2为输入值;
参数3为期望值;
参数4为输出值,此值被限制在范围+-65536;
3 pidreset为PID复位指令:
参数1为序列号,取值0--9,总共10个PID运算;
此指令会清除PID运算过程中保留的数据:比例误差,积分误差,微分误差。
例: pidinit 0 f90 f91 f92 f82 //pid0初始化,f90为kp;f91为ki;f92为kd;f82为更新周期
pidrun 1 f5 f85 f84 //pid1运算,f5为实际值,f85设定值,f84为pid输出
版权声明:本文为CSDN博主「chengsu317」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chengsu317/article/details/122879129
功能指令:
10 串口指令
编号 指令名 参数1 参数2 参数3 参数4 参数5 说明
1 serial K K Dn Dn Sn 串口初始化指令
2 serialsend K Dn Dn 串口发送指令
K Dn K
3 serialgetnum K Dn 获取串口接收字节数指令
1 serial为串口初始化指令:
参数1取值0或2。分别代表串口0,串口2.共2个串口。其中串口 0是板载的USB
接口,被系统使用,print,prints指令会通过串口0输出;
参数2表示波特率,最好取:9600,19200,38400,57600,115200,这几个波特率。
参数3表示要接收的数据寄存器起始地址,按字节选址。
参数4,串口实际接收的长度,即字节数,保存到这个Dn寄存器。
参数5,串口接收完成后会置位Sn,如果此Sn被中断程序注册,当串口接 收完成
后会 产生一个中断,程序会去执行中断程序。
2 serialsend为串口发送指令:
参数1取值0或2。分别代表串口0,串口2.共2个串口。其中串口 0被系统保留;
参数2表示要发送的数据寄存器起始地址,按字节寻址。
参数3,串口要发送的长度,即字节数。
3 serialgetnum为获取串口接收字节数指令:
参数1取值0或2。分别代表串口0,串口2.共2个串口。其中串口 0被系统保留;
参数2保存接收的字节数。如果不想用接收中断的方式处理接收的数据,可以用
这个 指令采取查询的方式处理接收数据,当获取的字节数大于0时,表示有数据被接
收了。
例:
serial 2 115200 D40 D10 S0 //串口2初始化,波特率115200,接收的数据
//保存在D40开始的地址,接收的字节数保存在
//D10寄存器,接收完成后S0会被置1
Serialsend 2 D20 5 //把D0寄存器的4个字节和D21的第0个字节,共5
//个字节发送出去
serialgetnum 2 D30 //获取串口接收的字节数保存到D30,实际D30=D40;也可以
//不使用这条指令,通过查询D10的值来处理接收的数据
11 IIC主指令
编号 指令名 参数1 参数2 参数3 参数4 说明
1 iic K K iic主初始化指令
2 iicwrite K Dn Dn Dn iic主写指令
K K Dn K
3 iicread K Dn Dn Dn iic主读指令
K K Dn K
1 iic为iic初始化指令:注意此IIC是工作在主模式;
参数1取值0或1,0表示按8位地址寻址,1表示按16位地址寻址。一般带 IIC接口
的传感器 都是按8位地址寻址,比如6轴传感器MPU6050;而IIC接口的存储芯片很多是
16位地 址寻址,比如24C256。
参数2通讯速率,单位Hz,一般用100000或400000;
2 iicwrite为iic写指令:
参数1表示从地址,即接口芯片的IIC地址。
参数2是接口芯片的寄存器起始地址;
参数3是要写的数据;
参数4表要写的数据的长度,按字节数;
3 iicread为iic读指令:
参数1表示从地址,即接口芯片的IIC地址。
参数2是接口芯片的寄存器起始地址;
参数3表示读出来的数据要存储的寄存器起始地址,按字节寻址。
参数4表示要读的数据的长度,按字节数;
例:
iic 0 400000 //8位地址寻址,速率400000Hz
iicwrite hd0 h1a D0 1 //0xd0是mpu6050的IIC地址,0x1a是被写的寄存器地址,D0 //是要写的数据,写1个字节,即把D0的最低字节写到mpu6050
//的0x1a寄存器里面
iicread hd0 h3b D10 6 //0xd0是mpu6050的IIC地址,0x3b是要读的寄存器地址
//起始地址,D10是读出来的数据要存储的起始寄存器,读6个
//字节,即D10里面从低到高字节依次存储4个字节,D11从低到高
//依次存储剩下的2个字节。
12 IICSLAVER从指令
编号 指令名 参数1 参数2 参数3 参数4 参数5 说明
1 iicslaver K In Dn Sn Sn iic从初始化指令
2 iicslaverwrite Dn Dn iic从写缓存指令
DIn Dn
1 iicslaver为iic从初始化指令:此IIC是工作在从模式;iic从的内部读写缓存都是128字节;
参数1--K,设置7位本机从地址;
参数2--In,使用寻址寄存器In,当主机要读写的寄存器地址(16位地址)保存到此寻址
寄存器里面, 注意,这里只能寻址整形寄存器Dn;
参数3--Dn,当主机写的时候,保存写的数据字节长度;
当主机读的时候,此寄存器值为读缓存长度128字节;
主机读的是前一次缓存中的数据,所以如果主机要读取最新的数据,主机要连续读2次,且
中间间隔至少50ms, 从机在第一次主机读的要在读中断中更新缓存中数据,当主机第2次
读取时就是 最新的数据内容。
参数4--Sn,读中断,当有主机读的时候,会置位此Sn;
参数5--Sn,写中断,当有主机写的时候,会置位此Sn;
2 iicslaverwrite为iic从写缓存指令,把寄存器内容写入发送缓存,待主机读取;
参数1,待写的数据寄存器起始地址;
参数2表示要写的数据的字节长度;
例:
iicslaver 52 i0 d0 s0 s1 //初始化IIC从,本机从地址52(注意是7位地址),I0保存主机
//要读写的寄存器地址,D0是读写字节长度,
//主读S0置位,主写S1置位
iicslaverwrite di0 d0 //IIC从更新发送缓存,i0是地址(主写的时候,I0已经保存了要
//写的地址),D0是字节数
13 SPI指令
编号 指令名 参数1 参数2 说明
1 spi K K spi初始化指令
2 spiwrite Dn spi写指令
3 spiread Dn spi读指令
4 spirw Dn Dn spi读写指令
Dn K
1 spi为spi初始化指令:
参数1取值0,1,2,3,表示SPI的4种工作模式;
参数2是速率,取值请参加下表
参数2取值 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
SPI速度(MHz) |
1 |
2 |
4 |
8 |
9 |
10 |
11 |
13 |
16 |
20 |
26 |
40 |
80 |
表3 SPI速度取值
2 spiwrite为spi写指令:
参数1是要写的数据,因为一次性只能写一个字节,所以写的是Dn 的最低字 节;
3 spiread为spi读指令:
参数1是读出的数据,因为一次性只能读一个字节,所以读出的字节 存储在Dn 的最低
字节;
4 spirw为spi读写指令:同步读写指令,写的同时也把数据读出来;
参数1是读出的数据,读出的字节存储在Dn的最低字节;
参数2是要写的数据,写入的是Dn的最低字节;
例: spi 3 0 //工作模式3,速率2MHz.
spiwrite d0 //把d0的最低字节写到spi装置
spiread d1 //从spi装置读取一个字节存储到d1的最低字节
spirw d1 d0 //把d0的最低字节写到spi装置同时读取一个字节存储到d1的最低字节
spirw d1 11 //把值11写到spi装置同时读取一个字节存储到d1的最低字节
14 定时器指令
编号 指令名 参数1 参数2 参数3 说明
1 time K K Sn 定时器初始化指令
2 timestart K K K 定时器启动指令
3 timestop K K 定时器停止指令
4 timeget K K Dn 定时器获取计时时间指令
1 time为定时器初始化指令:
参数1取值0-9,共10个定时器或者计时器;
参数2取值0或1,0表示周期性定时器,1表示计时器;周期性定时器会在计时到
指定时间后 又从头开始计时,如此周而复始。当定时时间到后,会置位Sn,所以可以
产生周期性中 断;而计时器会一直计时下去,当达到设定值时会置位Sn,产生一个中
断,然后继续计 时下去,不会从头开始,所以此计时器只会产生一次中断;
参数3,当计时到设定值时会置位Sn,如果Sn注册了中断程序,程序会跳 到中断
程序中执行;
2 timestart为定时器启动指令:启动定时器;
参数1取值0-9,共10个定时器或者计时器;
参数2取值0或1,0表示周期性定时器,1表示计时器;周期性定时器会在计时到
指定时间后 又从头开始计时,如此周而复始。当定时时间到后,会置位Sn,所以可以
产生周期性中 断;而计时器会一直计时下去,当达到设定值时会置位Sn,产生一个中
断,然后继续计 时下去,不会从头开始,所以此计时器只会产生一次中断;
参数3为设定定时值,单位为us;
3 timestop为定时器停止指令:定时器停止计时,参数1,2与time指令一样;
4 timeget为定时器获取计时时间指令:
参数1,2与time指令一样;
参数3获取当时的计时值,单位为us;
注意:
当参数2为0即定时器设置为周期性定时器时,此指令获取的时间是从timestart指令
开始到 此指令执行时的时间,但当发生中断时,会重新开始计时,所以读取的值会小于
等于设 定的周期值;
当参数2为1即定时器设置为计时器模式时,此指令获取的时间是从timestart指令开
始到 此指令执行时的时间,不会因为有中断而重新计时,此时间会一直累加上去。因为
寄存 器为4字节有负号数,所以最大计时大概35分钟左右;
例: time 1 0 S0 //初始化周期性定时器1,定时时间到会置位s0.
timestart 1 0 1000000 //启动周期性定时器1,定时时间1s.
timestop 1 0 //停止周期性定时器1.
timeget 1 0 d0 //获取当前的计时值保存到D0寄存器
15 PWM指令
编号 指令名 参数1 参数2 说明
1 pwm K Dn PWM初始化指令
2 pwmstart K Dn PWM启动指令
3 pwmsetduty K Dn PWM设置占空比指令
4 pwmstop K PWM停止指令
1 pwm为PWM初始化指令:
参数1为脉冲频率,单位Hz;
参数2为根据脉冲频率计算出的100%占空比时的值,保存到Dn寄存器;意思就是在
使用pwmstart 指令启动时,如果设置此值的一半,则占空比就是50%,设置四分之一就
是25%占空比; 此值会因为频率的变高而减小;
2 pwmstart为PWM启动指令:
参数1为通道,有0-7共8个通道;
参数2为占空比设定值,注意设定值不能超过pwm指令输出的Dn值。
3 pwmsetduty为PWM设置占空比指令:
参数1为通道,有0-7共8个通道;
参数2为占空比设定值,注意设定值不能超过pwm指令输出的Dn值。
4 pwmstop为PWM停止指令:
参数1为通道,有0-7共8个通道;
例: pwm 1000 d0 //pwm初始化,d0保存100%占空比的值
pwmstart 0 d0 //pwm0启动,100%占空比
pwmsetduty 0 d1 //改变占空比,如果d1=d0/2,占空比为50%
pwmstop 0 //停止pwm输出
16 有刷马达指令
编号 指令名 参数1 参数2 说明
1 brushmoto K K 有刷马达初始化指令
2 brushmotomove K Fn 有刷马达运行指令
K F
3 brushmotostop K 有刷马达停止指令
指令说明:
1 brushmoto为有刷马达初始化指令:
参数1为通道,有0-3共4个通道。可以同时驱动4个有刷马达;
参数2为频率,单位Hz。有刷马达的速度通过改变PWM的占空比来控制;
2 brushmotomove为有刷马达运行指令:
参数1为通道,有0-3共4个通道。
参数2为占空比设置,值为正时,马达正转,最大占空比100;为负时马达反转,最
大占空比-100;
3 brushmotostop为有刷马达停止指令:
参数1为通道,有0-3共4个通道。执行这条指令后,马达控制的2个端口都输出低电
平。与占 空比设置为0时的效果一样。
例: brushmoto 1 500 //有刷马达1初始化,频率500Hz
brushmotomove 1 60 //马达1以60%占空比运行
brushmotostop 1 //马达1停止运行
17 舵机指令
编号 指令名 参数1 参数2 说明
1 servomoto K 舵机初始化指令
2 servomotostart K K 舵机启动指令
K Dn
1 servomoto为舵机初始化指令:此指令可以驱动舵机;也可以通过电调驱动三相无刷马
达; 频率固定为400Hz,周期为2.5ms。
参数1为通道,有0-7共8个通道;
2 servomotostart为舵机启动指令:
参数1为通道,有0-7共8个通道;
参数2为输出高电平时间,单位us,最大2500,即2.5ms;
注意:
占空比的计算公式为:占空比=输出时间*100/2500 (%) ;
如果是通过电调驱动无刷电机,一般电调的输入控制为1-2ms,即1000-2000us,让
指令输出这个时间范围就可以让无刷马达从0到最大的速度之间转动;
如果是驱动舵机,有些舵机只有正角度,就使用1000-2000us的时间可以让舵机实
现0到最大角度;有些舵机是正负角度,可能要使用500-1500us的时间输出让舵机实现
正负角度转动。具体的输出时间需要参考舵机的使用说明书。
例: servomoto 1 //舵机1初始化
servomotostart 1 1500 //输出1500us,启动舵机1,要改变舵机速度, 输出不同的
//时间就可以了
servomotostart 1 1800 //输出1800us,增加舵机速度
版权声明:本文为CSDN博主「chengsu317」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chengsu317/article/details/122820106
25 MODBUS RTU指令
编号 指令名 参数1 参数2 参数3 参数4 参数5 说明
1 modbusrtum K K Sn MODBUS RTU主初始化指令
2 modbusrtumrw K K K Dn K MODBUS RTU主读写指令
Dn Dn Dn Dn Dn
3 modbusrtuc K K K Sn MODBUS RTU从初始化指令
4 modbusrtuclose MODBUS RTU关闭指令
1 modbusrtum为MODBUS RTU主初始化指令:
参数1为串口编号,取值0或者2;
参数2为串口波特率;
参数3,当串口数据接收完成时会置位Sn;
例: modbusrtum 0 115200 s0 //初始化串口0,波特率为115200
2 modbusrtumrw为MODBUS RTU主读写指令:
参数1为从机的PLC NO号,取值1-255;
参数2为功能码,支持1,3,5,6,16这几个功能码;
参数3为从设备的寄存器地址;
参数4根据功能码的不同,当为读时,Dn保存读的数据,当为写时,Dn为要写
的数据;
参数5,为要读写的数据长度,注意modbus一个数据长度有2个字节;但是在功
能码1时,数据长度单位是位;
例: mov 65280 d0 //d0存入65280(16进制FF00),使用功能码5置位输出口时,
//必须写65280
modbusrtumrw 1 5 16 d0 1 //1为从机PLC站号,5为位写功能码,16
//为位地址即Y0,D0=65280,表示把Y0置1;最
//后的1在功能码为5时不起作用,写个1就可以了
mov 0 d0 //d0存入0,使用功能码5复位输出口就写0
modbusrtumrw 1 5 16 d0 1 //1为从机PLC站号,5为位写功能码,16
//为位地址即Y0,D0=0,表示把Y0清0;最后的
//1在功能码为5时不起作用,写个1就可以了
modbusrtumrw 1 1 0 d0 11 //从机站号1,功能码1,读取地址0,读
//取到D0寄存器,共读取11位;这样就把X0-10
//一次性全部读取 到D0中,D0的第0-10位依次是
//输入口X0-10的电平值。
modbusrtumrw 1 1 16 d1 13 //从机站号1,功能码1,读取地址16,读
//取到D1寄存器,共读取13位;这样就把Y0-12一次
//性全部读取到D1中,D1的第0-12位依次是输出口
//Y0-10的电平值。
modbusrtumrw 1 3 100 d1 2 //从机站号1,功能码3,读取地址100,读
//取到D1寄存器,长度为2,即读取4个字节,实际
//就是读取D50的值到D1中;
modbusrtumrw 1 16 100 d1 2 //从机站号1,功能码16,写入地址100,
//写入数据为D1寄存器,长度为2,即读取4个字节, //实际就是把D1的值写到D50中;
modbusrtumrw 1 6 100 d1 1 //从机站号1,功能码6,写入地址100,写
//入数据为D1寄存器,长度固定为1。实际就是把D1 //的低2字节值写到D50中;
3 modbusrtuc为MODBUS RTU从初始化指令:
参数1为从PLC NO号,取值1-255;
参数2为串口编号,取值0或者2;
参数3为串口波特率;
参数4,当串口数据接收完成时会置位Sn;
例: modbusrtuc 0 115200 s0 //初始化串口0,波特率为115200
4 modbusrtuclose为MODBUS RTU关闭指令:
下表列出了IO口及Dn数据寄存器对应的地址及功能码:
IO口 |
操作 |
触摸屏对应地址 |
PLC对应地址 |
功能码 |
|
位读 |
位写 |
||||
X0 |
只读 |
0x1 |
0 |
1 |
|
X1 |
只读 |
0x2 |
1 |
1 |
|
X2 |
只读 |
0x3 |
2 |
1 |
|
X3 |
只读 |
0x4 |
3 |
1 |
|
X4 |
只读 |
0x5 |
4 |
1 |
|
X5 |
只读 |
0x6 |
5 |
1 |
|
X6 |
只读 |
0x7 |
6 |
1 |
|
X7 |
只读 |
0x8 |
7 |
1 |
|
X8 |
只读 |
0x9 |
8 |
1 |
|
X9 |
只读 |
0x10 |
9 |
1 |
|
X10 |
只读 |
0x11 |
10 |
1 |
|
Y0 |
可读写 |
0x17 |
16 |
1 |
5 |
Y1 |
可读写 |
0x18 |
17 |
1 |
5 |
Y2 |
可读写 |
0x19 |
18 |
1 |
5 |
Y3 |
可读写 |
0x20 |
19 |
1 |
5 |
Y4 |
可读写 |
0x21 |
20 |
1 |
5 |
Y5 |
可读写 |
0x22 |
21 |
1 |
5 |
Y6 |
可读写 |
0x23 |
22 |
1 |
5 |
Y7 |
可读写 |
0x24 |
23 |
1 |
5 |
Y8 |
可读写 |
0x25 |
24 |
1 |
5 |
Y9 |
可读写 |
0x26 |
25 |
1 |
5 |
Y10 |
可读写 |
0x27 |
26 |
1 |
5 |
Y11 |
可读写 |
0x28 |
27 |
1 |
5 |
Y12 |
可读写 |
0x29 |
28 |
1 |
5 |
M0 |
可读写 |
0x33 |
32 |
1 |
5 |
M1 |
可读写 |
0x34 |
33 |
1 |
5 |
... |
... |
... |
... |
... |
... |
M198 |
可读写 |
0x231 |
230 |
1 |
5 |
M199 |
可读写 |
0x232 |
231 |
1 |
5 |
表4 IO口的地址及对应功能码
注:X0-10是输入口,使用功能码1读取;Y0-12是输出口,M0-M199是中间寄
存器,使用功能码1读取,功能码5写;触摸屏对应地址目前是按威纶触摸屏对应;
PLC对应地址是实际通讯时的数据值,比如我们用串口助手调试的时候用这个地址
值。
功能码5一次只能置位或清零一个输出口;功能码1可以一次读取多个输入或输出口
Dn数据寄存器 |
操作 |
触摸屏对应地址 |
PLC对应地址 |
功能码 |
||
多寄存器读 |
多寄存器写 |
单寄存器写(2字节) |
||||
D0 |
可读写 |
4x1 |
0 |
3 |
16 |
6 |
D1 |
可读写 |
4x3 |
2 |
3 |
16 |
6 |
D2 |
可读写 |
4x5 |
4 |
3 |
16 |
6 |
D3 |
可读写 |
4x7 |
6 |
3 |
16 |
6 |
...... |
可读写 |
...... |
...... |
3 |
16 |
6 |
D997 |
可读写 |
4x1995 |
1994 |
3 |
16 |
6 |
D998 |
可读写 |
4x1997 |
1996 |
3 |
16 |
6 |
D999 |
可读写 |
4x1999 |
1998 |
3 |
16 |
6 |
表5 Dn数据寄存器的地址即对应可读写功能码
Dn数据寄存器 |
操作 |
触摸屏对应地址 |
PLC对应地址 |
功能码 |
多寄存器读 |
||||
D0 |
只读 |
3x1 |
0 |
4 |
D1 |
只读 |
3x3 |
2 |
4 |
D2 |
只读 |
3x5 |
4 |
4 |
D3 |
只读 |
3x7 |
6 |
4 |
...... |
只读 |
...... |
...... |
4 |
D997 |
只读 |
3x1995 |
1994 |
4 |
D998 |
只读 |
3x1997 |
1996 |
4 |
D999 |
只读 |
3x1999 |
1998 |
4 |
表6 Dn数据寄存器的地址即对应只读功能码
注:modbus通讯协议规定每个地址占2个字节。因为1个Dn数据寄存器是4个
字节,所以1个Dn数据寄存器占用2个地址。比如D0占用PLC地址是0,1;D1占用
2,3;D999占用1998,1999
26 EEPROM指令
编号 指令名 参数1 参数2 参数3 说明
1 eepromread K Dn K EEPROM 读指令
Dn Dn Dn
K Fn K
Dn Fn Dn
2 eepromwrite K Dn K EEPROM 写指令
Dn Dn Dn
K Fn K
Dn Fn Dn
EEPROM地址范围0--4095,最大4096个字节;EEPROM写是有寿命的,所以尽量少频繁的写。
1 eepromread为EEPROM 读指令:
参数1为要读取的地址,取值0--4095;
参数2为寄存器地址起始地址,读取的值保存在从此寄存器开始的地址;
参数3为要读取的数据长度,单位字节;
例: eepromread 0 d200 4 //从地址0开始读取4个字节保存到D200寄存器中,
//如果,地址0,1,2,3开始依次保存的是1,2,3,4,那么D200
//中从低到高字节依次是1,2,3,4,所以D200为16进制的值
//是4030201,10进制的值是67305985
2 eepromwrite为EEPROM 写指令:
参数1为要写的地址,取值0--4095;
参数2为寄存器地址起始地址,要写的值放在从此寄存器开始的地址;
参数3为要写的数据长度,单位字节;
例: eepromwrite 0 d200 4 //把D200寄存器中的值,从地址0开始,共写4个字节
27 PID指令
编号 指令名 参数1 参数2 参数3 参数4 参数5 说明
1 pidinit K Fn Fn Fn Fn PID初始化指令
2 pidrun K Fn Fn Fn PID运算指令
3 pidreset K PID复位指令
1 pidinit为PID初始化指令:
参数1为序列号,取值0--9,总共10个PID运算;
参数2为PID参数Kp;
参数3为PID参数Ki;
参数4为PID参数Kd;
参数5为PID参数更新周期T,单位秒;
2 pidrun为PID运算指令:
参数1为序列号,取值0--9,总共10个PID运算;
参数2为输入值;
参数3为期望值;
参数4为输出值,此值被限制在范围+-65536;
3 pidreset为PID复位指令:
参数1为序列号,取值0--9,总共10个PID运算;
此指令会清除PID运算过程中保留的数据:比例误差,积分误差,微分误差。
例: pidinit 0 f90 f91 f92 f82 //pid0初始化,f90为kp;f91为ki;f92为kd;f82为更新周期
pidrun 1 f5 f85 f84 //pid1运算,f5为实际值,f85设定值,f84为pid输出
版权声明:本文为CSDN博主「chengsu317」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chengsu317/article/details/122879129
暂无评论