任务列表
任务号 任务 站地址 读写 操作数地址 操作数量 数据地址
1 M01_变频器控制值 10 1 408193 1 VW2100
2 M01_写入频率值 10 1 408194 1 VW2102
3 M01_读取频率值 10 0 412289 1 VW2104
4 M01_读取电流值 10 0 412293 1 VW2106
5 M01_读取状态值 10 0 408449 1 VW2108
6 M01_读取故障值 10 0 408451 1 VW2110
7 M02_变频器控制值 20 1 408193 1 VW2200
8 M02_写入频率值 20 1 408194 1 VW2202
9 M02_读取频率值 20 0 412289 1 VW2204
10 M02_读取电流值 20 0 412293 1 VW2206
11 M02_读取状态值 20 0 408449 1 VW2208
12 M02_读取故障值 20 0 408451 1 VW2210
13 M03_变频器控制值 30 1 408193 1 VW2300
14 M03_写入频率值 30 1 408194 1 VW2302
15 M03_读取频率值 30 0 412289 1 VW2304
16 M03_读取电流值 30 0 412293 1 VW2306
17 M03_读取状态值 30 0 408449 1 VW2308
18 M03_读取故障值 30 0 408451 1 VW2310
我在这里的例子是三个子站,每个子站定义了6个任务,,一共18个任务;
在后面的程序中只用到任务号1-6,也就是只有一个子站,其他子站可以简单复制/修改一下子程序即可;
这个任务号是以后参数传递的纽带,可以自定义任务号,如果需要优先级也需要在这里定义好
主程序
LD First_Scan_On
FILL +0, VW1200, 102
MOVW +100, VW1200
//定义表格长度和初始化表格
LD 启动Modbus
EU
S 通讯令牌, 1
//初始化通讯令牌
LD Always_On
= L60.0
LD Always_On
= L63.7
LD L60.0
CALL MBUS_CTRL, L63.7, 19200, 0, 0, +1000, 启动Modbus, MB_StartError
//初始化MBUS_CTRL
LD Always_On
CALL M01
//处理1#子站
LD Always_On
TON T114, +20
A T114
CALL M01_Modbus_Read
//处理1#子站的变频器读取
LD T114
A 通讯令牌
AW>= VW1202, +1
EU
FIFO VW1200, TaskNo
CALL TaskNoToParameter, TaskNo, MB_Slave, MB_RW, MB_Addr, MB_Count, MB_DataPtr
S 开始通讯, 1
R 通讯令牌, 1
//MB-RTU任务出队列并传递参数
LD MB_Done
EU
CALL MB_Result, TaskNo, MB_Error
S 通讯令牌, 1
R 开始通讯, 1
R MB_Done, 1
//通讯完成检查
LD 开始通讯
= L60.0
LD 开始通讯
EU
= L63.7
LD L60.0
CALL MBUS_MSG, L63.7, MB_Slave, MB_RW, MB_Addr, MB_Count, MB_DataPtr, MB_Done, MB_Error
//MB-RTU通讯