VisualHMI Modbus 一主多从:시작_read 轮询、cycle 调度与读写从机

무료무료 기술 자료

이 글은 바로 읽을 수 있으며 기초 학습과 검색 유입에 적합합니다.

Modbus 一主多从:HMI 作为 Modbus 主机,通过 시작_read 后台轮询多个从机的寄存器。核心函数 시작_read 建任务、get_xxx 读缓存、on_cmd_resp 收结果——不阻塞스크립트。

1. 시작_read 参数

시작_read(index, vtype, addr, 수량, cycle, cycle_run, mode)
参数说明
index任务索引 0~127,stop_read(index) 用
vtype寄存器类型(VT_0x/VT_3x/VT_4x 等)
addr시작주소
수량读取数量 1~120 个寄存器
cycle选填,轮询周期倍数(默认 0=每周期都读)
cycle_run选填,周期内第几次执行(0-based,须 < cycle)
mode选填,0=持续周期读(默认)/1=仅读一次(需先 create_resp_que())

2. 基本用法

function on_init()
  -- 每周期都读从机0的 4x1000~1009(10个寄存器)
  시작_read(0, VT_4x, 0x1000, 10)
  -- 每 3 个周期读一次从机1的 4x2000~2009,且在周期内第3次执行
  시작_read(1, VT_4x, 0x2000, 10, 3, 2)
end

function on_run(screen)
  -- 读데이터直接拿缓存,零통신开销
  local v = get_uint16(VT_4x, 0x1000)
  local f = get_float(VT_4x, 0x2000)
end

시작_read 只建任务,实际데이터靠 get_xxx 从本地缓存读——和寄存器操作篇同一个机制。要拿读完成通知,用 on_cmd_resp 回调(需 create_resp_que 配合)。

3. 多从机轮询调度

-- 8 台从机,每台读 20 个寄存器,错开周期避免总线拥堵
function on_init()
  for i = 0, 7 do
    시작_read(i, VT_4x, 0x0000, 20, 8, i)  -- 8周期轮一遍,每周期读一台
  end
end

function on_cmd_resp(slave, vtype, addr, count, ret, wr)
  if ret == 0 then
    -- 第 slave 台从机读取成功,处理데이터
  else
    -- 통신异常,标记从机离线
  end
end

从机多了总线带宽有限,用 cycle/cycle_run 错峰读;异常在 on_cmd_resp 里 ret 非 0 判断,做离线标记。

三个坑:①수량 最大 120,超过要分多次 시작_read;②cycle_run 必须小于 cycle,且 cycle_run 从 0 计数;③stop_read 停止任务后缓存保留最后值——不会清零,判断离线要靠 on_cmd_resp 的 ret。

整理自 广州大彩科技 VisualHMI 开发文档(hmi-doc.gz-dc.com)LUA 教程「Modbus一主多从」,版权归大彩科技所有。

실제 프로젝트에 이 자료를 활용하시겠습니까?

도구 센터에서 프레임 분석, CRC 검증, 장비 디버깅을 진행하거나 요청을 제출하여 선정 및 연동 제안을 받아보세요.

엔지니어 회원

이 글을 실행 가능한 디버깅 자료로 활용하세요

가입하면 고급 프레임 분석, 자료 패키지 다운로드, 코드 예제, 엔지니어링 사례, 우선 기술 지원을 이용할 수 있어 실제 프로젝트 납품에 적합합니다.

고급 도구 무제한 이용
자료 패키지와 코드 패키지
완전한 엔지니어링 사례 라이브러리
우선 기술 지원 채널

发表回复

이메일 주소는 공개되지 않습니다. 必填项已用 * 标注