ReadMode 纠错   12 Apr 2016

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;
    }