ModbusTCP控制LED灯
# TaskRunner 自定程序 - ModbusTCP控制LED灯
# 1. 说明
- 任务运行器 TaskRunner 通过自定程序,采用ModbusTCP通讯协议,控制驳接在Arduino上的LED灯。ModbusTCP使用电脑来指定特定IP地址下的ModbusTCP从机,从而控制此从机。范例中使用Arduino开发板与Ethernet W5100网络扩展板,组合成ModbusTCP从机。
- PC设备(ModbusTCP主机)通过ModbusTCP通讯协议传送指令给指定的IP地址,该地址下对应一个ModbusTCP从机,要求打开连接该从机的LED灯,从机收到主机指令后会自动解码,接着完成ModbusTCP主机所指派的工作,开启LED灯。
- 范例中LED灯正极(针脚较长的一端)连接到电阻,再连接到Ethernet W5100的D8针脚,LED灯的负极连接到扩展板的GND针脚。
- 此范例要使用 Arduino 开源硬件平台来搭建配套使用的测试环境。如果仅为测试用途,可使用 Modbus 仿真程序来模拟设备。
# 2. 零件连接图

# 3. 使用零件
序 | 零件名称 | 数量 |
---|---|---|
1 | Arduino UNO R3 开发板 | 1 |
2 | Arduino Ethernet W5100 网络扩展板 | 1 |
3 | USB数据线 | 1 |
4 | 网线 | 1 |
5 | 面包板 | 1 |
6 | 杜邦线 | 若干 |
7 | LED灯 | 1 |
8 | 220欧姆电阻 | 1 |
Arduino开发板与Ethernet W5100网络扩展板组装完成后的外观如下图所示。

# 4. Arduino流程图

# 5. Arduino程序
使用Arduino IDE 编译并上传以下Arduino程序。
// 采用 MyArduinoProjects Modbus TCP 链接库
// http://myarduinoprojects.com/modbus.html
#include <SPI.h>
#include <Ethernet.h>
#include "MgsModbus.h" //引入Modbus TCP 链接库
MgsModbus Mb;
// 设置网络 (网络扩充卡 MAC 可自行修改 +1 避免冲突)
byte mac[] = {0x90, 0xA2, 0xDA, 0x0E, 0x94, 0xB6 }; //设置Arduino设备的网卡MAC地址
IPAddress ip(192, 168, 0, 162); //设置Arduino设备的网络IP地址
IPAddress gateway(192, 168, 0, 1); //设置网关的IP地址
IPAddress subnet(255, 255, 255, 0); //设置子网掩码
#define LED_PIN 8 //定义LED PIN为8
int LedSwitch=0;
void setup() {
Serial.begin(9600);
Ethernet.begin(mac, ip, gateway, subnet); // 启动网络
Serial.println("网络已经开通");
//设置要使用的缓存器地址
//0 1 2 3 4 是 Holding 缓存器的顺序,其地址分别是10000,10001,10002,10003,10004
// 新增缓存器 mb.MbData(i);
Mb.MbData[0] = 0; // 0=关闭LED灯 1=打开LED灯
pinMode(LED_PIN, OUTPUT); // 设定脚位 PIN 8为输出模式
}
void loop() {
LedSwitch=Mb.MbData[0]; // 读取数字缓存器的数值
if (LedSwitch!=0){
digitalWrite(LED_PIN, HIGH); //PIN 8输出为HIGH,LED点亮
}
else {
digitalWrite(LED_PIN, LOW); //PIN 8输出为LOW,LED熄灭
}
delay(500); //延时 0.5秒
Mb.MbsRun(); //呼叫 Modbus
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 6. 设计程序
TaskRunner 的初始示例已包含 ModbusTCP控制LED灯
自定程序。下面介绍创建自定程序的流程。
- 点击
自定程序
选项卡,在自定程序界面中点击新建
按钮,打开新建程序界面。 - 在新建程序界面,填写要设计的自定程序的基本信息。如下图所示。填写完成点击
保存
按钮。
- 返回自定程序列表界面,选择刚才创建的
JS015
自定程序,点击菜单栏中的设计
按钮,打开程序设计器界面。 - 在程序设计器界面中输入自定程序代码,代码示例如下。完成后,点击
保存
按钮。
{
//定义变量
var v,host,port,unitid;
var m = new TModbusTCPClient(nil);
host = iif(UgParams.Values["host"] == "","127.0.0.1",UgParams.Values["host"]);
port = iif(UgParams.Values["port"] == "","502",UgParams.Values["port"]);
unitid = iif(UgParams.Values["unitid"] == "","255",UgParams.Values["unitid"]);
//设置参数
TModbusTCPClient(m).Host = host;
TModbusTCPClient(m).Port = StrToInt(port);
TModbusTCPClient(m).UnitID = StrToInt(unitid);
//读取线圈状态
if (TModbusTCPClient(m).ReadHoldingRegister(1,v))
{
if (v == 0)
TModbusTCPClient(m).WriteRegister(1,1)
else
TModbusTCPClient(m).WriteRegister(1,0);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

- 如需要测试效果,可在程序设计器界面中点击
运行
按钮进行测试。测试过程中需使用 Modbus 仿真程序(如 Modbus Slave)来模拟 Modbus 设备,需模拟为保持寄存器。
程序中定义的参数说明如下:
名称 | 说明 | 是否必填 | 默认值 |
---|---|---|---|
host | Modbus 从机的地址 | 是 | 127.0.0.1 |
port | Modbus 连接的端口号 | 否 | 502 |
uintid | Modbus 设备ID | 否 | 255 |
# 7. 调用执行
设计完成的自定程序可使用以下方式来调用执行。
# 7.1. RestAPI
使用浏览器或RestAPI 客户端,访问以下地址,执行自定程序调用。请将 {ip}
修改为运行 TaskRunner 主机的IP地址,{port}
修改为 TaskRunner WebSocket 服务端监听的地址。
http://{ip}:{port}?restapi=script&taskname=JS015
如需要自定义参数,参照以下方式执行。其中将 {host}
替换为 Modbus 设备的 IP 地址。port
与 unitid
为非必填参数,如 Ardunio 未修改过端口号信息,此处可不引用这两个参数。
http://{ip}:{port}?restapi=script&taskname=JS015&host={host}&port={port}&unitid={unitid}
# 7.2. WebSocket
使用WebSocket客户端,连接至 TaskRunner 中的 WebSocket 服务端。向 WebSocket 服务端发送以下文本实现自定程序的调用。
{"action":"script","taskname":"JS015"}
如需要自定义参数,参照以下方式执行。其中将 {host}
替换为 Modbus 设备的 IP 地址。port
与 unitid
为非必填参数,如 Ardunio 未修改过端口号信息,此处可不引用这两个参数。
{"action":"script","taskname":"JS015","params":[{"name":"host","value":"{host}"},{"name":"port","value":"{port}"},{"name":"unitid","value":"{unitid}"}]}
# 7.3. MQTT
使用 MQTT 客户端,连接至 TaskRunner 连接的 MQTT 服务器。MQTT 客户端向 TaskRunner 订阅的主题发送以下文本实现自定程序的调用。
{"action":"script","taskname":"JS015"}
如需要自定义参数,参照以下方式执行。其中将 {host}
替换为 Modbus 设备的 IP 地址。port
与 unitid
为非必填参数,如 Ardunio 未修改过端口号信息,此处可不引用这两个参数。
{"action":"script","taskname":"JS015","params":[{"name":"host","value":"{host}"},{"name":"port","value":"{port}"},{"name":"unitid","value":"{unitid}"}]}