结合工业现场最典型的 “PLC + 触摸屏自由口通讯” 场景(以台达 DVP-ES2 PLC + 威纶通 MT8071IP 触摸屏为例),以下是完整的自由编程实现步骤,包含 PLC 程序、触摸屏组态、通讯调试,覆盖核心逻辑和避坑要点:
一、场景定义(明确需求)
实现 PLC 与触摸屏自由口双向通讯:
二、硬件与基础配置
1. 硬件接线
2. 核心参数约定
| 通讯方向 | 数据格式(十六进制) | 说明 |
|---|---|---|
| 触摸屏→PLC | 01 01 | 启动 Y0 |
| 触摸屏→PLC | 01 02 | 停止 Y0 |
| PLC→触摸屏 | 02 01 | Y0 启动成功反馈 |
| PLC→触摸屏 | 02 02 | Y0 停止成功反馈 |
| 通讯格式 | 9600,8,N,1 | 波特率 / 数据位 / 校验 / 停止位 |
三、PLC 程序编写(台达 WPLSoft)
台达 ES2 通过RS(发送)、RR(接收)指令实现自由口通讯,需先配置通讯格式寄存器,再编写收发逻辑:
1. 第一步:配置自由口通讯参数
plaintext
LD M8000 // 常闭触点,上电执行 MOV H0080 D8120 // 设置通讯格式:9600bps、8位、无校验、1停止位(H0080对应9600,8,N,1) SET M8161 // 启用8位二进制模式(自由口优先二进制) MOV K0 D8129 // 清空接收数据长度寄存器
2. 第二步:编写接收逻辑(解析触摸屏指令)
plaintext
// 接收触发:M8122(接收完成标志)触发解析 LD M8122 MOV D200 D0 // 将接收缓冲区(D200开始)数据移到D0(暂存) AND K0001 D0 K0001 // 判断是否为启动指令(01 01) OUT M0 // M0=1:启动指令有效 AND K0002 D0 K0002 // 判断是否为停止指令(01 02) OUT M1 // M1=1:停止指令有效 RST M8122 // 复位接收完成标志,准备下次接收 // 执行启动/停止逻辑 LD M0 SET Y0 // Y0=ON,启动输出 LD M1 RST Y0 // Y0=OFF,停止输出
3. 第三步:编写发送逻辑(反馈给触摸屏)
plaintext
// 启动成功反馈:Y0置1时发送02 01 LD Y0 AND NOT M2 // 防重复发送 MOV H0201 D100 // 反馈数据存入D100(02 01) RS K2 D100 K2 Y0 // RS指令:发送2字节(K2)、从D100开始、发送长度2、脉冲端Y0(COM2对应Y0) SET M2 // 标记已发送,避免重复 // 停止成功反馈:Y0置0时发送02 02 LD NOT Y0 AND NOT M3 // 防重复发送 MOV H0202 D100 // 反馈数据存入D100(02 02) RS K2 D100 K2 Y0 // 发送2字节反馈数据 SET M3 // 标记已发送 // 复位标记:指令切换时清空M2/M3 LD M0 RST M3 // 启动指令触发,复位停止反馈标记 LD M1 RST M2 // 停止指令触发,复位启动反馈标记
四、触摸屏组态(威纶通 EBPro)
威纶通触摸屏通过 “宏指令” 实现自由口收发,需先配置串口,再编写宏脚本,最后做按钮 / 显示界面:
1. 第一步:配置触摸屏串口参数
2. 第二步:编写宏指令(发送 / 接收逻辑)
威纶通宏指令用 C 语言风格,核心是serial_send(发送)、serial_receive(接收)函数:
(1)启动指令宏(btn_start.mcs)
c
运行
macro_command main(){
unsigned char send_data[2] = {0x01,0x01}; // 启动指令:01 01
serial_send(1, send_data, 2); // COM1发送2字节数据
// 接收反馈
unsigned char recv_data[2];
serial_receive(1, recv_data, 2, 100); // COM1接收2字节,超时100ms
if(recv_data[0]==0x02 && recv_data[1]==0x01)
{
SetData("Local HMI", "LW0", 0, 1); // LW0=1:启动成功
}}(2)停止指令宏(btn_stop.mcs)
c
运行
macro_command main(){
unsigned char send_data[2] = {0x01,0x02}; // 停止指令:01 02
serial_send(1, send_data, 2); // COM1发送2字节
// 接收反馈
unsigned char recv_data[2];
serial_receive(1, recv_data, 2, 100);
if(recv_data[0]==0x02 && recv_data[1]==0x02)
{
SetData("Local HMI", "LW0", 0, 2); // LW0=2:停止成功
}}3. 第三步:制作触摸屏界面
五、调试与避坑要点
六、扩展适配(其他品牌 PLC / 触摸屏)
最终效果
触摸屏点击 “启动 Y0”→发送 01 01→PLC 接收后 Y0 亮,返回 02 01→触摸屏 LW0 显示 1;触摸屏点击 “停止 Y0”→发送 01 02→PLC 接收后 Y0 灭,返回 02 02→触摸屏 LW0 显示 2;全程通过自由口自定义协议通讯,无依赖标准协议(如 MODBUS),适配非标场景。

