public void TestReadCoils() { IModbusMessage request; byte[] sendBytes = _modbusMaster.BuildReadCoilsCommand(slaveId, startAddress, numRegisters, out request); _sr.Write(sendBytes, 0, sendBytes.Length); byte[] readBuffer = new byte[1024]; int num = _sr.Read(readBuffer, 0, readBuffer.Length); byte[] readBytes = new byte[num]; Buffer.BlockCopy(readBuffer, 0, readBytes, 0, num); bool[] response = _modbusMaster.GetReadCoilsResponse(readBytes, numRegisters, request); }
/// <summary> /// 通讯正常,把返回的数据返回到此函数接口。在Protocol类中的CheckData函数对数据进行校验。 /// </summary> /// <param name="info"></param> public override void Communicate(IResponseInfo info) { if (_sendObject == null) { OnDeviceRuningLog("没有获得对应的发送请求实例"); return; } byte[] revData = info.Data; IModbusMessage requestMessage = _sendObject.ModbusMessage; ITag tag = _sendObject.Tag; bool deal = false; object val = null; if (tag.Function == Modbus.Modbus.ReadCoils) { #region bool[] responseVals = _modbusTcpMaster.GetReadCoilsResponse(revData, tag.Quantity, requestMessage); if (responseVals.Length >= 1) { val = responseVals[0] == true ? 1 : 0; this.DeviceDynamic.DynamicData.Write(tag.TagName, val); deal = true; } #endregion } else if (tag.Function == Modbus.Modbus.ReadInputs) { #region bool[] responseVals = _modbusTcpMaster.GetReadInputsResponse(revData, tag.Quantity, requestMessage); if (responseVals.Length >= 1) { val = responseVals[0] == true ? 1 : 0; this.DeviceDynamic.DynamicData.Write(tag.TagName, val); deal = true; } #endregion } else if (tag.Function == Modbus.Modbus.ReadHoldingRegisters) { #region ushort[] responseVals = _modbusTcpMaster.GetReadHoldingRegistersResponse(revData, requestMessage); if (responseVals.Length >= 1) { val = responseVals[0]; this.DeviceDynamic.DynamicData.Write(tag.TagName, val); deal = true; } #endregion } else if (tag.Function == Modbus.Modbus.ReadInputRegisters) { #region ushort[] responseVals = _modbusTcpMaster.GetReadInputRegistersResponse(revData, requestMessage); if (responseVals.Length >= 1) { val = responseVals[0]; this.DeviceDynamic.DynamicData.Write(tag.TagName, val); deal = true; } #endregion } if (deal && val != null) { OnDeviceRuningLog("通讯正常,已经处理数据,值:" + (val == null ? "未知" : val.ToString())); this.DeviceDynamic.Save(); } }