Skip to content

pipe "inovance" — 汇川 PLC ​

协议名:"inovance"

汇川 H3U / H5U 系列 PLC,走以太网 Modbus TCP,但地址用汇川软元件名而不是 Modbus 寄存器号。读写方法的返回值约定和错误码见 7.1 Pipe 通信概述。

平台限制

本协议只在上位机版本和 Linux 网关版本里提供,ESP32 机型不支持,调用会返回 nil。

ESP32 上访问汇川 PLC 用 "modbus.tcp",自己按汇川手册换算 Modbus 地址。

创建管道 ​

lua
pipe.setup("inovance", "ip[:port]") --> pipe | nil
形式说明
"192.168.1.100:502"指定 IP 和端口
"192.168.1.100"用默认端口 502
lua
h3u = pipe.setup("inovance", "192.168.1.100:502")

说明

  • 底层是标准 Modbus TCP,单元号固定 1,不可配。

地址格式 ​

前缀软元件编号进制类型
X输入八进制位(只读)
Y输出八进制位
M辅助继电器十进制位
S步进十进制位
T定时器(映射到 TD 区)十进制字
C计数器(映射到 CD 区)十进制字
D数据寄存器十进制字
lua
h3u:read_bite("X0")        -- X 是八进制
h3u:write_bite("Y0", true)
h3u:read_u16("D100", 10)
h3u:read_float("D200")

说明

  • X / Y 是八进制,其它软元件十进制。X10 = 十进制编号 8 的输入点。
  • T / C 访问当前值寄存器(TD / CD 区)。
  • X 区只能读。
  • 代码里不做地址范围检查。

可用方法 ​

可用:read_bite write_bite read_u16 write_u16 read_s16 write_s16 read_u32 read_s32 read_float

空实现(读返回 nil,写返回失败):

write_u32 write_s32 write_float read_double write_double read_string write_string

32 位数据只能读不能写,双精度和字符串不支持。要写 32 位就拆成两个 write_u16。

p:read() / p:write() 未实现。

常见用法 ​

lua
h3u = pipe.setup("inovance", "192.168.1.100:502")

function poll()
  local ret = h3u:read_u16("D100", 20)
  if ret.errno == 0 then
    for i = 1, 20 do plc.d(i, ret.data[i]) end
  end

  local f = h3u:read_float("D200")
  if f.errno == 0 then print("速度:", f.data[1]) end
end

t = timer.start(500, poll)

注意事项 ​

  • ESP32 固件不支持本协议,返回 nil。
  • X / Y 用八进制编号。
  • 32 位写、双精度、字符串不可用。
  • 单元号固定 1,多台设备请改用 "modbus.tcp" 指定 slave。
  • 管道对象要用全局变量长期持有。

例程 ​

每个例程都是可直接下载运行的完整脚本(仅上位机 / Linux 网关版本,ESP32 上 pipe.setup("inovance", ...) 返回 nil)。底层是以太网 Modbus TCP,地址用汇川软元件名。通用接口见 8.1 概述。统一模板「场景 / 完整代码 / 要点 / 验证方法 / 注意事项」。

例程 1:轮询 D 区 + 读浮点(以太网) ​

适用:LP3232 / LP3288 / 软PLC模拟器 / 上位机(不含 ESP32)| 依赖模块:pipe timer plc | 难度:★☆☆

场景:汇川 H3U/H5U 系列,每 500ms 把 D100 起 20 个字读到本机 D 区,并读 D200 浮点速度打印。

完整代码(可直接下载运行):

lua
h3u = pipe.setup("inovance", "192.168.1.100:502")   -- 第二参字符串 IP:端口
if not h3u then
    print("创建失败(ESP32 不支持 inovance,改用 modbus.tcp)")
    return
end

function poll()
    local ret = h3u:read_u16("D100", 20)
    if ret.errno == 0 then
        for i = 1, 20 do plc.d(i, ret.data[i]) end
    end
    local f = h3u:read_float("D200")
    if f.errno == 0 then print("速度:", f.data[1]) end
end

t = timer.start(500, poll)

要点:

  • pipe.setup("inovance", "192.168.1.100:502") —— 第二参是字符串;底层标准 Modbus TCP,单元号固定 1。
  • X / Y 用八进制编号,其它十进制(X10 = 十进制编号 8);X 只读。
  • ESP32 上创建返回 nil,必须判空;要上 ESP32 请用 "modbus.tcp" 自己换算 Modbus 地址。

验证方法:上位机 / Linux 网关版本运行,本机 D100~D119 出现汇川 D100~D119 的值。

注意事项:X/Y 八进制易算错;32 位只能读不能写、双精度/字符串不支持——写 32 位要拆两个 write_u16。


例程 2:写回(写方法返回整数错误码) ​

适用:同上 | 依赖模块:pipe | 难度:★☆☆

场景:把 1234 写到 D300,并置位 Y0。

完整代码(可直接下载运行):

lua
local h3u = pipe.setup("inovance", "192.168.1.100:502")
if not h3u then return end

local e1 = h3u:write_u16("D300", 1234)
local e2 = h3u:write_bite("Y0", true)
print("写D:", e1 == 0 and "OK" or "FAIL", "写Y:", e2 == 0 and "OK" or "FAIL")

要点:写方法返回整数错误码;X 只读不能写。

验证方法:汇川侧 D300 = 1234、Y0 = 1。

注意事项:写返回整数非 table,别查 result.errno;32 位/双精度/字符串写是空实现。


例程 3:注意事项——X 只读 / X Y 八进制 ​

适用:同上 | 依赖模块:pipe | 难度:★☆☆

场景:最常见的两类误用:对 X 写、X/Y 十进制编号。

完整代码(可直接下载运行):

lua
local h3u = pipe.setup("inovance", "192.168.1.100:502")
if not h3u then return end

-- ❌ 错误
h3u:write_bite("X0", true)     -- X 只读,被拒

-- ✅ 正确
h3u:read_bite("X0")            -- X 只读 OK
h3u:write_bite("Y0", true)     -- Y 可写

要点:X 只读;X/Y 八进制编号;T/C 访问当前值寄存器(TD/CD 区)。

验证方法:正确写法生效;错误写法被拒。

注意事项:ESP32 用 inovance 会返回 nil;单元号固定 1,多台设备改用 "modbus.tcp" 指定 slave。

LPPLC 工业物联网云平台 · 软硬件与云平台全栈自研