重构部分枚举, 让models包不依赖其他项目中的包
This commit is contained in:
@@ -3,37 +3,8 @@ package command_generater
|
||||
import (
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// ModbusFunctionCode 定义Modbus功能码的枚举类型
|
||||
type ModbusFunctionCode byte
|
||||
|
||||
// 定义常用的Modbus功能码常量及其应用场景
|
||||
const (
|
||||
// ReadCoils 读取线圈状态 (0x01)
|
||||
// 场景: 用于读取数字量输出(DO)或内部标志位的当前状态,这些状态通常是开关量。
|
||||
ReadCoils ModbusFunctionCode = 0x01
|
||||
// ReadDiscreteInputs 读取离散输入状态 (0x02)
|
||||
// 场景: 用于读取数字量输入(DI)的当前状态,这些状态通常是外部传感器的开关量信号。
|
||||
ReadDiscreteInputs ModbusFunctionCode = 0x02
|
||||
// ReadHoldingRegisters 读取保持寄存器 (0x03)
|
||||
// 场景: 用于读取设备内部可读写的参数或数据,例如温度设定值、电机速度等模拟量或配置数据。
|
||||
ReadHoldingRegisters ModbusFunctionCode = 0x03
|
||||
// ReadInputRegisters 读取输入寄存器 (0x04)
|
||||
// 场景: 用于读取设备的模拟量输入(AI)数据,这些数据通常是只读的,例如当前温度、压力、电压等实时测量值。
|
||||
ReadInputRegisters ModbusFunctionCode = 0x04
|
||||
// WriteSingleCoil 写入单个线圈 (0x05)
|
||||
// 场景: 用于控制单个数字量输出(DO),例如打开或关闭一个继电器、指示灯等。
|
||||
WriteSingleCoil ModbusFunctionCode = 0x05
|
||||
// WriteSingleRegister 写入单个保持寄存器 (0x06)
|
||||
// 场景: 用于修改设备内部的单个可写参数,例如设置一个温度控制器的目标温度、调整一个阀门的开度等。
|
||||
WriteSingleRegister ModbusFunctionCode = 0x06
|
||||
// WriteMultipleCoils 写入多个线圈 (0x0F)
|
||||
// 场景: 用于批量控制多个数字量输出(DO),例如同时打开或关闭一组继电器。
|
||||
WriteMultipleCoils ModbusFunctionCode = 0x0F
|
||||
// WriteMultipleRegisters 写入多个保持寄存器 (0x10)
|
||||
// 场景: 用于批量修改设备内部的多个可写参数,例如一次性更新多个配置参数或模拟量输出值。
|
||||
WriteMultipleRegisters ModbusFunctionCode = 0x10
|
||||
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
|
||||
)
|
||||
|
||||
// GenerateModbusRTUReadCommand 生成Modbus RTU读取指令
|
||||
@@ -52,7 +23,7 @@ const (
|
||||
//
|
||||
// []byte: 完整的Modbus RTU指令字节切片。
|
||||
// error: 如果参数无效或生成过程中出现错误,则返回错误信息。
|
||||
func GenerateModbusRTUReadCommand(slaveAddress uint8, functionCode ModbusFunctionCode, startAddress uint16, quantity uint16) ([]byte, error) {
|
||||
func GenerateModbusRTUReadCommand(slaveAddress uint8, functionCode models.ModbusFunctionCode, startAddress uint16, quantity uint16) ([]byte, error) {
|
||||
// 1. 校验输入参数
|
||||
if slaveAddress == 0 || slaveAddress > 247 {
|
||||
return nil, fmt.Errorf("从站地址无效: %d, 必须在1-247之间", slaveAddress)
|
||||
@@ -60,9 +31,9 @@ func GenerateModbusRTUReadCommand(slaveAddress uint8, functionCode ModbusFunctio
|
||||
|
||||
// 校验功能码是否为读取类型
|
||||
switch functionCode {
|
||||
case ReadCoils, ReadDiscreteInputs, ReadHoldingRegisters, ReadInputRegisters:
|
||||
case models.ReadCoils, models.ReadDiscreteInputs, models.ReadHoldingRegisters, models.ReadInputRegisters:
|
||||
// 这些是支持的读取功能码
|
||||
case WriteSingleCoil, WriteSingleRegister, WriteMultipleCoils, WriteMultipleRegisters:
|
||||
case models.WriteSingleCoil, models.WriteSingleRegister, models.WriteMultipleCoils, models.WriteMultipleRegisters:
|
||||
return nil, fmt.Errorf("功能码 %X 是写入操作,请使用 GenerateModbusRTUWriteCoilCommand 或其他写入函数", functionCode)
|
||||
default:
|
||||
return nil, fmt.Errorf("不支持的功能码: %X", functionCode)
|
||||
@@ -130,7 +101,7 @@ func GenerateModbusRTUSwitchCommand(slaveAddress uint8, coilAddress uint16, onOf
|
||||
// 2. 构建PDU (协议数据单元) for WriteSingleCoil (0x05)
|
||||
// PDU结构: 功能码 (1字节) + 线圈地址 (2字节) + 写入值 (2字节)
|
||||
pdu := make([]byte, 5)
|
||||
pdu[0] = byte(WriteSingleCoil)
|
||||
pdu[0] = byte(models.WriteSingleCoil)
|
||||
// Modbus协议中,地址和值都是大端字节序 (高位在前)
|
||||
binary.BigEndian.PutUint16(pdu[1:3], coilAddress)
|
||||
binary.BigEndian.PutUint16(pdu[3:5], writeValue)
|
||||
|
||||
Reference in New Issue
Block a user