agrobot_base/AgroBase/AgroBase/Models/Modules/WT901C485/Wt901c/Components/Modbus16Resolver.cs

75 lines
2.6 KiB
C#

using System;
using System.Diagnostics;
using System.Linq;
using Wit.SDK.Device.Device.Device.DKey;
using Wit.SDK.Modular.Sensor.Device;
using Wit.SDK.Modular.Sensor.Modular.ProtocolResolver.Interface;
using Wit.SDK.Modular.Sensor.Modular.Resolver.Utils;
using Wit.SDK.Modular.Sensor.Utils;
using Wit.SDK.Utils;
namespace Wit.SDK.Modular.Sensor.Modular.ProtocolResolver.Roles
{
/// <summary>
/// Resolvedor de Protocolo ModbusCRC16
/// </summary>
public class Modbus16Resolver : IProtocolResolver
{
/// <summary>
/// Analisa os dados retornados ativamente
/// </summary>
/// <param name="data"></param>
/// <param name="baseDevice"></param>
public override void OnReceiveData(DeviceModel baseDevice, byte[] data)
{
}
/// <summary>
/// Envia dados
/// </summary>
/// <param name="sendData"></param>
/// <param name="deviceModel"></param>
public override void OnReadData(DeviceModel deviceModel, byte[] sendData, int delay = -1)
{
try
{
delay = AutoDelayUtils.GetModbusAutoDelay(delay, deviceModel);
byte[] returnData;
// Envia dados
deviceModel.SendData(sendData, out returnData, true, delay);
// Se os dados retornados estiverem corretos
byte[] modbusBytes;
if (sendData != null && returnData != null && returnData.Length >= 7
&& Modbus16Utils.FindModbus(sendData, returnData, out modbusBytes))
{
int readReg = sendData[2] << 8 | sendData[3];
byte[] regData = modbusBytes.Skip(3).Take(modbusBytes.Length - 5).ToArray();
for (int j = 0; regData != null &&
j < regData.Length - 1; j += 2)
{
string key = string.Format("{0:X2}", readReg++);
short value = (short)(regData[j] << 8 | regData[j + 1]);
deviceModel.SetDeviceData(new ShortKey(key), value);
}
}
else
{
if (returnData != null && returnData.Length > 0)
{
Debug.WriteLine("Erro na verificação dos dados");
Debug.WriteLine(ByteArrayConvert.ByteArrayToHexString(returnData));
}
}
}
catch (Exception ex)
{
Console.WriteLine("Erro: " + ex.Message);
}
}
}
}