
modbus协议设备根据查询帧获取变量值
1.按需生成列
public class TcpBLL
{
private int _beginPosition;
private int _bytesLength;
public DataTable Dt { set; get; }
public List<byte[]> allBytes { get; set; }
private Dictionary<int, string[]> myStore;
private TcpHelper.TcpComm tcp;
private TcpBLL()
{
/* 定义Tcp通信对象 */
tcp = new TcpHelper.TcpComm();
myStore = new Dictionary<int, string[]>();
/* tcp默认为Client模式,请设置需要连接的服务器IPE地址 */
tcp.ServerIPE = new IPEndPoint(IPAddress.Parse("192.168.0.29"), 6000);
}
public static TcpBLL GetTcp()
{
TcpBLL tcpbll = new TcpBLL();
return tcpbll;
}
/* 返回应答帧 */
public string GetReply(string lookFor)
{
IEnumerable<string> all = lookFor.Split(Environment.NewLine.ToArray(),StringSplitOptions.RemoveEmptyEntries);
List<byte> sends = new List<byte>();
List<byte[]> allSends = new List<byte[]>();
StringBuilder str = new StringBuilder();
foreach (var a in all)
{
int i = 0;
this._beginPosition=Convert.ToInt32(a.Substring(4,4),16);
this._bytesLength=Convert.ToInt32(a.Substring(8,4),16);
while(i<a.Length)
{
sends.Add(Convert.ToByte(a.Substring(i, 2), 16));
i += 2;
}
byte[] gets = tcp.Send(sends.ToArray());
allSends.Add(gets);
sends.Clear();
string b= BitConverter.ToString(gets);
str.AppendLine(b);
}
this.allBytes = allSends;
return str.ToString();
}
/* 通过查询帧获得地址对应表 */
public DataTable GetAddressValues()
{
string data="";
string data1="";
string data2="";
byte[] bytes = allBytes[0];
DataTable dt = new DataTable();
DataColumn index = new DataColumn();
index.ColumnName = "Index";
index.DataType = System.Type.GetType("System.Int32");
DataColumn address = new DataColumn();
address.DataType = System.Type.GetType("System.String");
address.ColumnName = "Address";
DataColumn value = new DataColumn();
value.DataType = System.Type.GetType("System.Int32");
value.ColumnName = "Value";
dt.Columns.Add(address);
dt.Columns.Add(value);
dt.Columns.Add(index);
int j = 0;
for (int i = 0; i < _bytesLength;i++ )
{
try
{
data1 = Convert.ToString(bytes[j + 3], 16);
if (data1.Length < 2) data1 = "0"+data1;
data2=Convert.ToString(bytes[j + 4], 16);
if (data2.Length < 2) data2 = "0"+data2;
data = data1 + data2;
string [] ownData = { data1,data2 };
j += 2;
dt.Rows.Add(_beginPosition + i, Convert.ToInt32(data, 16), i + 1);
if (!myStore.ContainsKey(Convert.ToInt32(data, 16)))
{
myStore.Add(Convert.ToInt32(data, 16), ownData);
}
else
{
continue;
}
}
catch
{
MessageBox.Show("查询帧无返回数据");
break;
}
}
Dt = dt;
return dt;
}
public void ValidateZero(ref string a ){
if (a == "0")
{
a = "00";
}
}
public DataTable UniqueAssembly()
{
DataTable dtValue = new DataTable();
string data = string.Empty;
int data1 = 0;
int data2 = 0;
string[] ownData1 = null;
string[] ownData2 = null;
DataRow row = dtValue.NewRow();
DTSD.Fre f = new DTSD.Fre();
DTSD.U u=new DTSD.U();
bool applyF = false;
int i=0;
int s;
double times = 0.0;
int enumAddress = 0;
int j=402-_beginPosition;
while (i < Dt.Rows.Count)
{
Type ts = null;
if (i < j)
{
data1 = Convert.ToInt32(Dt.Rows[i]["Value"]);
data2 = Convert.ToInt32(Dt.Rows[i + 1]["Value"]);
ownData1 = myStore[Convert.ToInt32(data1)];
ownData2 = myStore[Convert.ToInt32(data2)];
data = ownData1[0] + ownData1[1] + ownData2[0] + ownData2[1];
ts = u.GetType();
enumAddress = Convert.ToInt32(Dt.Rows[i]["Address"]);
i += 2;
times = 10000.0;
}
else
{
data1 = Convert.ToInt32(Dt.Rows[i]["Value"]);
ownData1 = myStore[Convert.ToInt32(data1)];
data = ownData1[0] + ownData1[1];
enumAddress = Convert.ToInt32(Dt.Rows[i]["Address"]);
applyF = true;
ts = f.GetType();
i++;
times = 1000.0;
}
DTSD.STATUS address = (DTSD.STATUS)enumAddress;
if (int.TryParse(address.ToString(), out s)) continue;
if (address.ToString() == "F") times = 100.0;
double v = Convert.ToInt32(data, 16) / times;
if (v == 0) continue;
if (applyF) ts.GetProperty(address.ToString()).SetValue(f, v, null);
else ts.GetProperty(address.ToString()).SetValue(u, v, null);
DataColumn one = new DataColumn();
one.ColumnName = address.ToString();
one.DataType = Type.GetType("System.Double");
dtValue.Columns.Add(one);
row[address.ToString()] = v;
}
dtValue.Rows.Add(row);
return dtValue;
}
/* 通用取值方法 */
public DataTable CommonAssembly(object o, int index,double times)
{
DataTable dtValue = new DataTable();
string data = string.Empty;
int data1 = 0;
int data2 = 0;
string[] ownData1 = null;
string[] ownData2 = null;
DataRow row = dtValue.NewRow();
for (int i = 0; i < Dt.Rows.Count; i += index)
{
data1 = Convert.ToInt32(Dt.Rows[i]["Value"]);
data2=Convert.ToInt32(Dt.Rows[i + 1]["Value"]);
ownData1 = myStore[Convert.ToInt32(data1)];
ownData2 = myStore[Convert.ToInt32(data2)];
data = ownData1[0] + ownData1[1] + ownData2[0] + ownData2[1];
int enumAddress = Convert.ToInt32(Dt.Rows[i]["Address"]);
DTSD.STATUS address = (DTSD.STATUS)enumAddress;
Type ts = o.GetType();
double v = Convert.ToInt32(data, 16) / times;
if (v == 0) continue;
ts.GetProperty(address.ToString()).SetValue(o, v, null);
DataColumn one = new DataColumn();
one.ColumnName = address.ToString();
one.DataType = Type.GetType("System.Double");
dtValue.Columns.Add(one);
row[address.ToString()] = v;
}
dtValue.Rows.Add(row);
return dtValue;
}
/* 取值 */
public DataTable GetExsitValue()
{
DataTable dt = new DataTable();
int end=_beginPosition+_bytesLength-1;
if (_beginPosition < 297)
{
DTSD.E e = new DTSD.E();
dt=CommonAssembly(e, 10,100.0);
}
else if (_beginPosition<400 && end<401)
{
DTSD.U u = new DTSD.U();
dt=CommonAssembly(u, 2,10000.0);
}
else
{
dt = UniqueAssembly();
}
else if (_beginPosition<405 && end==409)
return dt;
}




近期评论