有时候,modbus读数程序写好了,需要测试一下,这个时候突然会感觉好麻烦哦,工业环境不可能搬我们办公室的,到现场去测试,去不方便,环境不允许经常测试来测试去。于是乎,自己写了一个模拟modbus程序。
#region modbus 数据
/// <summary>
///
/// 00 00 00 00 00 06 01 03 00 00 00 05
/// </summary>
/// <param name="rData"></param>
/// <returns>00 00 00 00 00 0d 01 03 0A 14 00 14 00 14 00 14 00 14 00</returns>
public static byte[] GetData(byte[] rData, DataTable dt)
{
//请求设备数
int len = 256 * Convert.ToInt32(rData[10]) + Convert.ToInt32(rData[11]);
if (len > 255)
{
return GetErrorData();
}
//请求开始地址
int address = 256 * Convert.ToInt32(rData[8]) + Convert.ToInt32(rData[9]);
short id = Convert.ToInt16(rData[6]);
List<byte> sendData = new List<byte>(255);
//标示符号
sendData.Add(rData[0]);
sendData.Add(rData[1]);
//sendData.Add(rData[1]);//标示符号
//地址域
sendData.AddRange(new Byte[] { 0x00, 0x00 }); //TCP协议
//长度 两个字节
byte[] b1 = ValueHelper.Instance.GetBytes(Convert.ToInt16(2 * len +3));
sendData.AddRange(b1); //返回字节数组@总长度
sendData.Add(Convert.ToByte(id));//域号 设备ID
//功能码
sendData.Add((byte)3); //功能码 3-读
//byte[] b2 = ValueHelper.Instance.GetBytes(Convert.ToInt16(2 * len));
//一个字节
sendData.Add(Convert.ToByte(2 * len)); //返回数据字节长度
//sendData.AddRange(t);
SetData(sendData,id,address, len, dt);
byte[] datas = sendData.ToArray();
return datas;
}
private static void SetData(List<byte> sendData,short id,int address, int len,DataTable dt)
{
string AlarmType = ConfigHelper.GetConfigFileName("AlarmType");
int d = 0x1400;
bool _Odd = IsOdd();
for (int i = 0; i < len; i++)
{
d = 0x1400;
int add = address + i;
if (AlarmType == "1")
{
d = _Odd ? 0x0c10 : 0x1400;
}
else
{
string filter = string.Concat("id='", id, "' and address='", add, "'");
if (dt != null && dt.Rows.Count > 0 && dt.Select(filter).Length > 0)
{
DataRow dr = dt.Select(filter)[0];
d = (Convert.ToString(dr["flag"]) == "报警") ? 0x0c10 : 0x3400; //3088
string tempId = string.Concat(id, "-", add);
if (AlarmId != tempId)
{
AlarmId = tempId;
Blank.Log.LogHelper.WriteLog(string.Concat(id, "-", add, " ", d));
}
}
}
byte[] temp = ValueHelper.Instance.GetBytes(Convert.ToInt16(d));
sendData.AddRange(temp);
}
}
private static bool IsOdd()
{
int i = DateTime.Now.Second;
return Convert.ToBoolean(i & 1);
}
#endregion
ServiceTest.exe 执行程序,打开的端口号就是modbus 默认端口号502。
绿色软件,无需安装,编写语言 C#
发送那个设备号的数据过来,发送什么数据过去
右边表格里面的数据是报警数据,报警规则就是换成二进制16位,第13位是1就是报警。