EdgeX设备驱动代码分析device-modbus-go
1. config.go
创建连接信息结构体
type ConnectionInfo struct { Protocol string Address string Port int BaudRate int DataBits int StopBits int Parity string UnitID uint8 // Connect & Read timeout(seconds) Timeout int // Idle timeout(seconds) to close the connection IdleTimeout int}
func createConnectionInfo() //创建连接信息结构体func parseIntValue() //检查string是否存在并转换为intfunc createRTUConnectionInfo() //创建RTU连接func createTCPConnectionInfo() //创建TCP连接
2. constant.go
全局常量定义
3. deviceclient.go
DeviceClient接口,指令信息结构体
func createCommandInfo() //创建指令信息结构体func calculateAddressLength() //计算数据地址长度,valueType/RawTypefunc TransformDataBytesToResult()//转换设备发送的二进制数据到valueTypefunc TransformCommandValueToDataBytes() //利用modbus协议将中数据转换为二进制数据func calculateByteCount() //计算数据Byte数func getBinaryData() //获取二进制数据
4. driver.go
type Driver struct { Loggerlogger.LoggingClient AsyncCh chan<- *sdkModel.AsyncValues mutex sync.Mutex addressMap map[string]chan bool workingAddressCount map[string]int stopped bool}
func (d *Driver) lockAddress() //lockAddress标记地址不可用,因为实际设备一次处理一个请求func (d *Driver) unlockAddress() //在命令完成后解除锁定地址func (d *Driver) lockableAddress() //lockableAddress根据协议返回可锁定地址func (d *Driver) HandleReadCommands() //处理读命令func handleReadCommandRequest() //处理读命令请求func (d *Driver) HandleWriteCommands() //处理写命令func handleWriteCommandRequest() //处理写命令请求func (d *Driver) Stop() //关闭正在使用的通道func (d *Driver) waitAllCommandsToFinish() //检查并等待未完成的jobfunc (d *Driver) AddDevice()func (d *Driver) UpdateDevice()func (d *Driver) RemoveDevice()func NewProtocolDriver()
5. modbusclient.go
与底层modbus驱动交互
//ModbusClient用于连接设备和读写值type ModbusClient struct { // IsModbusTcp是一个指示连接类型的值 IsModbusTcp bool // TCPClientHandler用于保持TCP设备连接 TCPClientHandler MODBUS.TCPClientHandler // TCPClientHandler用于保持RTU设备连接 RTUClientHandler MODBUS.RTUClientHandler client MODBUS.Client}
func (c *ModbusClient) OpenConnection() //打开设备连接func (c *ModbusClient) CloseConnection() //关闭设备连接func (c *ModbusClient) GetValue() //读数据func (c *ModbusClient) SetValue() //写数据func NewDeviceClient() //新建modbus客户端
6. protocolpropertykey.go
协议属性关键字,常量
const ( ProtocolTCP = "modbus-tcp" ProtocolRTU = "modbus-rtu" Address = "Address" Port = "Port" UnitID = "UnitID" BaudRate = "BaudRate" DataBits = "DataBits" StopBits = "StopBits" // Parity: N - None, O - Odd, E - Even Parity = "Parity" Timeout = "Timeout" IdleTimeout = "IdleTimeout")
7. swap.go
//字节交换与字交换func swap32BitDataBytes(dataBytes []byte, isByteSwap bool, isWordSwap bool){if isByteSwap {newDataBytes[0] = dataBytes[1]newDataBytes[1] = dataBytes[0]newDataBytes[2] = dataBytes[3]newDataBytes[3] = dataBytes[2]copy(dataBytes, newDataBytes)}if isWordSwap {newDataBytes[0] = dataBytes[2]newDataBytes[1] = dataBytes[3]newDataBytes[2] = dataBytes[0]newDataBytes[3] = dataBytes[1]}}
8. utils.go
工具包
func castStartingAddress() //强制转换起始地址func normalizeRawType() //规范化原始数据类型func castSwapAttribute() //强制转换交换属性