工作日志内容
工作日志。接收合并器发送的数据并进行相应的分析,最后进行存储。
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
else34

{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
else62

{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。表示是否为182
int []yaoXinD=new int [32];83

84
//两路直流量data85
int [] zhiLiuD=new int[2]; 86

87
//设备号88
int no = (int)myByte[0];89

90
//表示2+32个sno号.myInt[0]与myInt[1]表示直流量。其余表示状态量。10|00000|00000091
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
//直流量数据1103
for (int i = 0; i < 4; i++)104

{105
zhiLiu[0] += (int)myByte[5 - i] *(int) Math.Pow(256, i);106
}107

108
//直流量数据2109
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|000000158
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位中有几位是1187
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位中有几位是1196
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

浙公网安备 33010602011771号