工作日志内容

Code
  1        接收合并器发送来的数据并进行相应的处理#region 接收合并器发送来的数据并进行相应的处理
  2
  3        /**//// <summary>
  4        /// 接收合并器信息
  5        /// </summary>

  6        static void Recive(int port)
  7        {
  8            bool myBool;
  9
 10            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//初始化一个Scoket协议
 11
 12            //IPAddress receiveIPAddress = IPAddress.Parse("192.168.137.110");             
 13
 14            IPEndPoint iep = new IPEndPoint(IPAddress.Any, port);//初始化一个侦听局域网内部所有IP和指定端口
 15
 16            EndPoint ep = (EndPoint)iep;
 17
 18            socket.Bind(iep);//绑定这个实例
 19
 20            while (true)
 21            {
 22                byte[] buffer = new byte[104];//设置缓冲数据流
 23
 24                socket.ReceiveFrom(buffer, ref ep);//接收数据,并确把数据设置到缓冲流里面
 25
 26                myBool = Check(buffer);
 27                if (myBool)
 28                {
 29                    if (buffer[2== 0x0c)
 30                    {
 31                        ZhiLiu(buffer);
 32                    }

 33                    else
 34                    {
 35                        YaoCe(buffer);
 36                    }

 37                }

 38            }

 39        }

 40
 41        /**//// <summary>
 42        /// 校验接收上来的字符串是否正确
 43        /// </summary>

 44        static bool Check(byte[] myByte)
 45        {
 46            //校验位
 47            byte bt=myByte[0];
 48            
 49
 50            //如果是收上来直流量或遥信
 51            if (myByte[1== 0x0c)
 52            {
 53                for (int i = 0; i < 16; i++)
 54                {
 55                    bt = (byte)(bt ^ myByte[i + 1]);
 56                }

 57                if (bt == myByte[16])
 58                    return true;
 59                else return false;
 60            }

 61            else
 62            {
 63                int num = YaoCeLuShu(myByte);
 64                int ziJieShu = 8 * num + 8;
 65
 66                for (int i = 0; i < ziJieShu-1; i++)
 67                {
 68                    bt = (byte)(bt ^ myByte[i + 1]);
 69                }

 70                if (bt == myByte[ziJieShu-1])
 71                    return true;
 72                else return false;
 73            }

 74        }

 75
 76        /**//// <summary>
 77        /// 对直流量和遥信进行处理
 78        /// </summary>

 79        static void ZhiLiu(byte[] myByte)
 80        {
 81            //32路遥信量data。表示是否为1
 82            int []yaoXinD=new int [32];
 83
 84            //两路直流量data
 85            int [] zhiLiuD=new int[2];            
 86
 87            //设备号
 88            int no = (int)myByte[0];
 89
 90            //表示2+32个sno号.myInt[0]与myInt[1]表示直流量。其余表示状态量。10|00000|000000
 91            int[] zhiLiu = new int[34];
 92
 93            zhiLiu[0= 1 * 2024 + 0 + no;
 94            zhiLiu[1= 1 * 2024 + 1 * 64 + no;
 95            
 96            //32个状态量编号
 97            for (int i = 0; i < 32; i++)
 98            {
 99                zhiLiu[i + 2= (3 * 8 + i / 4* 256 + i % 4 + no;
100            }

101            
102            //直流量数据1
103            for (int i = 0; i < 4; i++)
104            {
105                zhiLiu[0+= (int)myByte[5 - i] *(int) Math.Pow(256, i);
106            }

107
108            //直流量数据2
109            for (int i = 0; i < 4; i++)
110            {
111                zhiLiuD[1+=  (int)myByte[9 - i] * (int)Math.Pow(256, i);
112            }

113
114            //循环计数器
115            int m = 0;
116
117            //求32位的状态信息
118            for (int i = 0; i < 4; i++)
119            {
120                for (int j = 0; j < 8; j++)
121                {
122                    yaoXinD[m] = myByte[i + 10&((int) Math.Pow(2, j));
123                    m++;
124                }

125            }

126
127            //发送2个直流量数据
128            for (int i = 0; i < 2; i++)
129            {
130                Updata(zhiLiuD[i], zhiLiu[i]);
131            }

132
133            //发送32个遥信量
134            for (int i = 0; i < 32; i++)
135            {
136                Updata(yaoXinD[i],zhiLiu[i+2]);
137            }

138                      
139        }

140
141        /**//// <summary>
142        /// 对遥测信息进行相应的存储
143        /// </summary>

144        static void YaoCe(byte[] myByte)
145        {
146            int yaoCeShu=YaoCeLuShu(myByte);
147
148            //设备编号
149            int no = (int)myByte[0];
150
151            //12路遥测号
152            int []yaoCeH=new int [12];
153
154            //48个数据
155            int []yaoCeD=new int [4*yaoCeShu];
156
157            //十二路的遥测号码。00|00000|000000
158            for (int i = 0; i < yaoCeShu; i++)
159            {
160                yaoCeH[i] = (i / 4* 256 + (i % 4* 64 + no;
161            }
          
162
163            //循环求48个数据
164
165            for (int j = 0; j < 4 * yaoCeShu; j++)
166            {
167                yaoCeD[j] = myByte[7+2*j] * 256 + myByte[7+2*j+1];                
168            }

169
170            for (int i = 0; i < 4 * yaoCeShu; i++)
171            {
172                int j = i % yaoCeShu;
173                Updata(yaoCeD[i], yaoCeH[j]);
174            }

175           
176        }

177
178        /**//// <summary>
179        /// 计算遥测共多少路
180        /// </summary>

181        static int YaoCeLuShu(byte[] myByte)
182        {
183            //判断有多少路信息
184            int num = 0;
185
186            //判断4位中有几位是1
187            for (int i = 0; i < 4; i++)
188            {
189                int j = 0;
190                j = myByte[3& (int)Math.Pow(2, i);
191                if (j == 0)
192                    num++;
193            }

194
195            //判断8位中有几位是1
196            for (int i = 0; i < 8; i++)
197            {
198                int j = 0;
199                j = myByte[4& (int)Math.Pow(2, i);
200                if (j == 0)
201                    num++;
202            }

203
204            return num;
205        }

206
207        static void Update(long data, int sno)
208        
209        }

210
211        static void Updata(int data, int sno)
212        
213        }

214
215        #endregion
 
216

转载于:https://www.cnblogs.com/cxfcxf8/archive/2008/06/10/1216542.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值