Modbus 分 ACSII 模式和RTU模式
你要的是那种。namespace Modbus_ASCII
{
public class ASCII_Data
{
#region 通讯字段定义
byte Heading;
byte SlaveAdd_Hi;
byte SlaveAdd_Lo;
byte Function_Hi;
byte Function_Lo;
byte ByteCountHi;
byte ByteCountLo;
public byte[] Data;
byte StartAddHI_Hi;
byte StartAddHI_Lo;
byte StartAddLO_Hi;
byte StartAddLO_Lo;
byte NumOfPointHI_Hi;
byte NumOfPointHI_Lo;
byte NumOfPointLO_Hi;
byte NumOfPointLO_Lo;
public byte LRC_Hi;
public byte LRC_Lo;
byte End_Hi;
byte End_Lo;
public int DataLength;
#endregion
public ASCII_Data(string cmd,string Add,string Num)
{
Heading = (byte)':';
SlaveAdd_Hi = (byte)'0';
SlaveAdd_Lo = (byte)'1';
End_Hi = 0x0D;
End_Lo = 0x0A;
//switch (cmd)
//{
// case "": //}
char[] AddChar = new char[4];
AddChar = Add.ToCharArray();
StartAddHI_Hi = (byte)AddChar[0];
StartAddHI_Lo = (byte)AddChar[1];
StartAddLO_Hi = (byte)AddChar[2];
StartAddLO_Lo = (byte)AddChar[3];
char[] NumChar = new char[4];
NumChar = Num.ToCharArray();
NumOfPointHI_Hi = (byte)NumChar[0];
NumOfPointHI_Lo = (byte)NumChar[1];
NumOfPointLO_Hi = (byte)NumChar[2];
NumOfPointLO_Lo = (byte)NumChar[3];
}
public ASCII_Data(string Add)
{
try
{
Heading = (byte)':';
SlaveAdd_Hi = (byte)'0';
SlaveAdd_Lo = (byte)'1';
End_Hi = 0x0D;
End_Lo = 0x0A;
//switch (cmd)
//{
// case "": //}
//char[] FunctionChar = new char[2];
//FunctionChar =
Function_Hi = (byte)'0';
Function_Lo = (byte)'3';
char[] AddChar = new char[4];
if (Add.ToCharArray().Length > 4)
{
throw new IndexOutOfRangeException();
}
AddChar = Add.ToCharArray();
StartAddHI_Hi = (byte)AddChar[0];
StartAddHI_Lo = (byte)AddChar[1];
StartAddLO_Hi = (byte)AddChar[2];
StartAddLO_Lo = (byte)AddChar[3]; NumOfPointHI_Hi = (byte)'0';
NumOfPointHI_Lo = (byte)'0';
NumOfPointLO_Hi = (byte)'0';
NumOfPointLO_Lo = (byte)'1';
CheckLRC();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
public ASCII_Data(byte[] dataRecv)
{
int startNum =0;
foreach (byte start in dataRecv)
{
if(dataRecv[startNum]!= (byte)':')
startNum++;
else
break;
}
if (dataRecv[startNum] != 0x7E)
{
throw new Exception("错误帧");
}
Heading = dataRecv[startNum++];
SlaveAdd_Hi = dataRecv[startNum++];
SlaveAdd_Lo = dataRecv[startNum++];
Function_Hi = dataRecv[startNum++];
Function_Lo = dataRecv[startNum++];
ByteCountHi = dataRecv[startNum++];
ByteCountLo = dataRecv[startNum++];
byte[] ByteCount = new byte[] { ByteCountHi, ByteCountLo };
DataLength = Convert.ToUInt16(Encoding.ASCII.GetString(ByteCount));
dataRecv = new byte[DataLength * 2];
for (int index = 0; index < (DataLength * 2); index++)
{
Data[index] = dataRecv[startNum++];
}
if (dataRecv[startNum] == 0x0D)
End_Hi = dataRecv[startNum++];
else
throw new Exception("错误帧");
if (dataRecv[startNum] == 0x0A)
End_Lo = dataRecv[startNum];
else
throw new Exception("错误帧");
} public void CheckLRC()
{
string SumString ="";
try
{
if (Data == null)
{
byte[] SlaveAdd = new byte[] { SlaveAdd_Hi, SlaveAdd_Lo };
byte[] Function = new byte[] { Function_Hi, Function_Lo };
byte[] StartAddHi = new byte[] { StartAddHI_Hi, StartAddHI_Lo };
byte[] StartAddLo = new byte[] { StartAddLO_Hi, StartAddLO_Lo };
byte[] NumOfPointHi = new byte[] { NumOfPointHI_Hi, NumOfPointHI_Lo };
byte[] NumOfPointLo = new byte[] { NumOfPointLO_Hi, NumOfPointLO_Lo };
byte Sum = (byte)(Convert.ToUInt16(Encoding.ASCII.GetString(SlaveAdd), 16) + Convert.ToUInt16(Encoding.ASCII.GetString(Function), 16) + Convert.ToUInt16(Encoding.ASCII.GetString(StartAddHi), 16) + Convert.ToUInt16(Encoding.ASCII.GetString(StartAddLo), 16) + Convert.ToUInt16(Encoding.ASCII.GetString(NumOfPointHi), 16) + Convert.ToUInt16(Encoding.ASCII.GetString(NumOfPointLo), 16));
Sum = (byte)(~Sum + 1);
SumString = Convert.ToString(Sum, 16);
if (Sum < 0x10)
{
SumString = "0" + SumString;
}
char[] LRC = SumString.ToCharArray(); LRC_Hi = (byte)LRC[0];
LRC_Lo = (byte)LRC[1]; }
else
{
//string DataString;
int index = 0;
byte tempByte = 0 ;
byte Sum = 0;
byte[] SlaveAdd = new byte[] { SlaveAdd_Hi, SlaveAdd_Lo };
byte[] Function = new byte[] { Function_Hi, Function_Lo };
foreach (byte dataByte in Data)
{
if (index == 0)
{
tempByte = dataByte;
index++;
}
else
{
byte[] tempByteArray = new byte[] { tempByte, dataByte };
Sum += (byte)(Convert.ToUInt16(Encoding.ASCII.GetString(tempByteArray), 16));
index = 0;
}
}
Sum = (byte)(~Sum + 1);
SumString = Convert.ToString(Sum, 16);
if (Sum < 0x10)
{
SumString = "0" + SumString;
}
char[] LRC = SumString.ToCharArray(); LRC_Hi = (byte)LRC[0];
LRC_Lo = (byte)LRC[1]; }
}
catch (Exception ex)
{
throw new Exception(ex.Message); }
}
public byte[] GetBytes()
{
if (Data == null)
{
byte[] dataSend = new byte[17];
Buffer.BlockCopy(BitConverter.GetBytes(Heading), 0, dataSend, 0, 1);
Buffer.BlockCopy(BitConverter.GetBytes(SlaveAdd_Hi), 0, dataSend, 1, 1);
Buffer.BlockCopy(BitConverter.GetBytes(SlaveAdd_Lo), 0, dataSend, 2, 1);
Buffer.BlockCopy(BitConverter.GetBytes(Function_Hi), 0, dataSend, 3, 1);
Buffer.BlockCopy(BitConverter.GetBytes(Function_Lo), 0, dataSend, 4, 1);
Buffer.BlockCopy(BitConverter.GetBytes(StartAddHI_Hi), 0, dataSend, 5, 1);
Buffer.BlockCopy(BitConverter.GetBytes(StartAddHI_Lo), 0, dataSend, 6, 1);
Buffer.BlockCopy(BitConverter.GetBytes(StartAddLO_Hi), 0, dataSend, 7, 1);
Buffer.BlockCopy(BitConverter.GetBytes(StartAddLO_Lo), 0, dataSend, 8, 1);
Buffer.BlockCopy(BitConverter.GetBytes(NumOfPointHI_Hi), 0, dataSend, 9, 1);
Buffer.BlockCopy(BitConverter.GetBytes(NumOfPointHI_Lo), 0, dataSend, 10, 1);
Buffer.BlockCopy(BitConverter.GetBytes(NumOfPointLO_Hi), 0, dataSend, 11, 1);
Buffer.BlockCopy(BitConverter.GetBytes(NumOfPointLO_Lo), 0, dataSend, 12, 1);
Buffer.BlockCopy(BitConverter.GetBytes(LRC_Hi), 0, dataSend, 13, 1);
Buffer.BlockCopy(BitConverter.GetBytes(LRC_Lo), 0, dataSend, 14, 1);
Buffer.BlockCopy(BitConverter.GetBytes(End_Hi), 0, dataSend, 15, 1);
Buffer.BlockCopy(BitConverter.GetBytes(End_Lo), 0, dataSend, 16, 1);
return dataSend; }
else
{
return null;
}
}
}
}这个是我关于ASCII版本的代码。
ASCII_Data SendData = new ACSII_Data("你要的地址Add");socket.send(SendData.GetBytes());你参考下自己写吧。
你要的是那种。namespace Modbus_ASCII
{
public class ASCII_Data
{
#region 通讯字段定义
byte Heading;
byte SlaveAdd_Hi;
byte SlaveAdd_Lo;
byte Function_Hi;
byte Function_Lo;
byte ByteCountHi;
byte ByteCountLo;
public byte[] Data;
byte StartAddHI_Hi;
byte StartAddHI_Lo;
byte StartAddLO_Hi;
byte StartAddLO_Lo;
byte NumOfPointHI_Hi;
byte NumOfPointHI_Lo;
byte NumOfPointLO_Hi;
byte NumOfPointLO_Lo;
public byte LRC_Hi;
public byte LRC_Lo;
byte End_Hi;
byte End_Lo;
public int DataLength;
#endregion
public ASCII_Data(string cmd,string Add,string Num)
{
Heading = (byte)':';
SlaveAdd_Hi = (byte)'0';
SlaveAdd_Lo = (byte)'1';
End_Hi = 0x0D;
End_Lo = 0x0A;
//switch (cmd)
//{
// case "": //}
char[] AddChar = new char[4];
AddChar = Add.ToCharArray();
StartAddHI_Hi = (byte)AddChar[0];
StartAddHI_Lo = (byte)AddChar[1];
StartAddLO_Hi = (byte)AddChar[2];
StartAddLO_Lo = (byte)AddChar[3];
char[] NumChar = new char[4];
NumChar = Num.ToCharArray();
NumOfPointHI_Hi = (byte)NumChar[0];
NumOfPointHI_Lo = (byte)NumChar[1];
NumOfPointLO_Hi = (byte)NumChar[2];
NumOfPointLO_Lo = (byte)NumChar[3];
}
public ASCII_Data(string Add)
{
try
{
Heading = (byte)':';
SlaveAdd_Hi = (byte)'0';
SlaveAdd_Lo = (byte)'1';
End_Hi = 0x0D;
End_Lo = 0x0A;
//switch (cmd)
//{
// case "": //}
//char[] FunctionChar = new char[2];
//FunctionChar =
Function_Hi = (byte)'0';
Function_Lo = (byte)'3';
char[] AddChar = new char[4];
if (Add.ToCharArray().Length > 4)
{
throw new IndexOutOfRangeException();
}
AddChar = Add.ToCharArray();
StartAddHI_Hi = (byte)AddChar[0];
StartAddHI_Lo = (byte)AddChar[1];
StartAddLO_Hi = (byte)AddChar[2];
StartAddLO_Lo = (byte)AddChar[3]; NumOfPointHI_Hi = (byte)'0';
NumOfPointHI_Lo = (byte)'0';
NumOfPointLO_Hi = (byte)'0';
NumOfPointLO_Lo = (byte)'1';
CheckLRC();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
public ASCII_Data(byte[] dataRecv)
{
int startNum =0;
foreach (byte start in dataRecv)
{
if(dataRecv[startNum]!= (byte)':')
startNum++;
else
break;
}
if (dataRecv[startNum] != 0x7E)
{
throw new Exception("错误帧");
}
Heading = dataRecv[startNum++];
SlaveAdd_Hi = dataRecv[startNum++];
SlaveAdd_Lo = dataRecv[startNum++];
Function_Hi = dataRecv[startNum++];
Function_Lo = dataRecv[startNum++];
ByteCountHi = dataRecv[startNum++];
ByteCountLo = dataRecv[startNum++];
byte[] ByteCount = new byte[] { ByteCountHi, ByteCountLo };
DataLength = Convert.ToUInt16(Encoding.ASCII.GetString(ByteCount));
dataRecv = new byte[DataLength * 2];
for (int index = 0; index < (DataLength * 2); index++)
{
Data[index] = dataRecv[startNum++];
}
if (dataRecv[startNum] == 0x0D)
End_Hi = dataRecv[startNum++];
else
throw new Exception("错误帧");
if (dataRecv[startNum] == 0x0A)
End_Lo = dataRecv[startNum];
else
throw new Exception("错误帧");
} public void CheckLRC()
{
string SumString ="";
try
{
if (Data == null)
{
byte[] SlaveAdd = new byte[] { SlaveAdd_Hi, SlaveAdd_Lo };
byte[] Function = new byte[] { Function_Hi, Function_Lo };
byte[] StartAddHi = new byte[] { StartAddHI_Hi, StartAddHI_Lo };
byte[] StartAddLo = new byte[] { StartAddLO_Hi, StartAddLO_Lo };
byte[] NumOfPointHi = new byte[] { NumOfPointHI_Hi, NumOfPointHI_Lo };
byte[] NumOfPointLo = new byte[] { NumOfPointLO_Hi, NumOfPointLO_Lo };
byte Sum = (byte)(Convert.ToUInt16(Encoding.ASCII.GetString(SlaveAdd), 16) + Convert.ToUInt16(Encoding.ASCII.GetString(Function), 16) + Convert.ToUInt16(Encoding.ASCII.GetString(StartAddHi), 16) + Convert.ToUInt16(Encoding.ASCII.GetString(StartAddLo), 16) + Convert.ToUInt16(Encoding.ASCII.GetString(NumOfPointHi), 16) + Convert.ToUInt16(Encoding.ASCII.GetString(NumOfPointLo), 16));
Sum = (byte)(~Sum + 1);
SumString = Convert.ToString(Sum, 16);
if (Sum < 0x10)
{
SumString = "0" + SumString;
}
char[] LRC = SumString.ToCharArray(); LRC_Hi = (byte)LRC[0];
LRC_Lo = (byte)LRC[1]; }
else
{
//string DataString;
int index = 0;
byte tempByte = 0 ;
byte Sum = 0;
byte[] SlaveAdd = new byte[] { SlaveAdd_Hi, SlaveAdd_Lo };
byte[] Function = new byte[] { Function_Hi, Function_Lo };
foreach (byte dataByte in Data)
{
if (index == 0)
{
tempByte = dataByte;
index++;
}
else
{
byte[] tempByteArray = new byte[] { tempByte, dataByte };
Sum += (byte)(Convert.ToUInt16(Encoding.ASCII.GetString(tempByteArray), 16));
index = 0;
}
}
Sum = (byte)(~Sum + 1);
SumString = Convert.ToString(Sum, 16);
if (Sum < 0x10)
{
SumString = "0" + SumString;
}
char[] LRC = SumString.ToCharArray(); LRC_Hi = (byte)LRC[0];
LRC_Lo = (byte)LRC[1]; }
}
catch (Exception ex)
{
throw new Exception(ex.Message); }
}
public byte[] GetBytes()
{
if (Data == null)
{
byte[] dataSend = new byte[17];
Buffer.BlockCopy(BitConverter.GetBytes(Heading), 0, dataSend, 0, 1);
Buffer.BlockCopy(BitConverter.GetBytes(SlaveAdd_Hi), 0, dataSend, 1, 1);
Buffer.BlockCopy(BitConverter.GetBytes(SlaveAdd_Lo), 0, dataSend, 2, 1);
Buffer.BlockCopy(BitConverter.GetBytes(Function_Hi), 0, dataSend, 3, 1);
Buffer.BlockCopy(BitConverter.GetBytes(Function_Lo), 0, dataSend, 4, 1);
Buffer.BlockCopy(BitConverter.GetBytes(StartAddHI_Hi), 0, dataSend, 5, 1);
Buffer.BlockCopy(BitConverter.GetBytes(StartAddHI_Lo), 0, dataSend, 6, 1);
Buffer.BlockCopy(BitConverter.GetBytes(StartAddLO_Hi), 0, dataSend, 7, 1);
Buffer.BlockCopy(BitConverter.GetBytes(StartAddLO_Lo), 0, dataSend, 8, 1);
Buffer.BlockCopy(BitConverter.GetBytes(NumOfPointHI_Hi), 0, dataSend, 9, 1);
Buffer.BlockCopy(BitConverter.GetBytes(NumOfPointHI_Lo), 0, dataSend, 10, 1);
Buffer.BlockCopy(BitConverter.GetBytes(NumOfPointLO_Hi), 0, dataSend, 11, 1);
Buffer.BlockCopy(BitConverter.GetBytes(NumOfPointLO_Lo), 0, dataSend, 12, 1);
Buffer.BlockCopy(BitConverter.GetBytes(LRC_Hi), 0, dataSend, 13, 1);
Buffer.BlockCopy(BitConverter.GetBytes(LRC_Lo), 0, dataSend, 14, 1);
Buffer.BlockCopy(BitConverter.GetBytes(End_Hi), 0, dataSend, 15, 1);
Buffer.BlockCopy(BitConverter.GetBytes(End_Lo), 0, dataSend, 16, 1);
return dataSend; }
else
{
return null;
}
}
}
}这个是我关于ASCII版本的代码。
ASCII_Data SendData = new ACSII_Data("你要的地址Add");socket.send(SendData.GetBytes());你参考下自己写吧。
解决方案 »
- 静态变量如何序列化?
- 求一个winform下treeview的checkbox可以显示3种状态的代码
- 急!XmlTextReader读取带属性的空节点时,无法读取节点尾部,求教!!
- winForm的Icon问题
- 急!!!求一个正则表达式 在线等~~
- 如何在一个窗体中操纵另外一个窗体中的事件?
- “创建窗口句柄时出错!”这样的异常如何解决?
- C#的数据模块问题。
- 如何知道Excel中有多少行?谢谢
- winfrom如何将一个按钮控件的图片,用在另一个控件上。按钮的image属性是System.Drawing.Bitmap
- 请教VS2008 自定义模板问题?
- 求助!如何用C#语句做模糊查询!(不要sql语句)
太感谢你的帮助! 是ASCII模式
初次了解协议这块。我多研究一下~~