
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