根据实际PLC数据修复数据解析逻辑
基于原始值.txt中的PLC实际数据,修复了三个关键解析问题:
1. 字符串解析修复
- 修正字节顺序,正确解析ProductModel和ProductCode
- 从[25185,25699,26213...]正确解析为"abcdefghij1234567890"
2. 整型数据解析优化
- 添加无效数据检测,识别[-7616,1]等无效值
- 改进32位寄存器组合的无符号处理
- 保持正确的缩放因子应用(如12345 → 123.45)
3. 时间戳解析重构
- 新增专用时间戳字符串解析方法
- 修正字节顺序,从[12338,13618,14128...]正确解析
- 成功解析为"202507191340"格式并转换为DateTime
测试验证:所有数据类型解析已通过实际PLC数据验证
| | |
| | | /// The main entry point for the application. |
| | | /// </summary> |
| | | [STAThread] |
| | | static void Main() |
| | | static void Main(string[] args) |
| | | { |
| | | // æ£æ¥å½ä»¤è¡åæ° |
| | | if (args.Length > 0) |
| | | { |
| | | switch (args[0].ToLower()) |
| | | { |
| | | case "demo": |
| | | ConfigDemo.RunDemoAsync().Wait(); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | // To customize application configuration such as set high DPI settings or default font, |
| | | // see https://aka.ms/applicationconfiguration. |
| | | ApplicationConfiguration.Initialize(); |
| | |
| | | if (config.Encoding?.ToLower() == "littleendian") |
| | | { |
| | | // å°ç«¯ï¼ä½ä½å¨å |
| | | value = registers[0] | (registers[1] << 16); |
| | | value = (registers[0] & 0xFFFF) | ((long)(registers[1] & 0xFFFF) << 16); |
| | | } |
| | | else |
| | | { |
| | | // 大端ï¼é«ä½å¨åï¼é»è®¤ï¼ |
| | | value = (registers[0] << 16) | registers[1]; |
| | | value = ((long)(registers[0] & 0xFFFF) << 16) | (registers[1] & 0xFFFF); |
| | | } |
| | | |
| | | // æ£æ¥æ¯å¦ä¸ºæ ææ°æ®æ è¯ï¼å¦è´å¼ç»åï¼ |
| | | if (value == 0xE2400001 || value > 0x7FFFFFFF) |
| | | { |
| | | // å¯è½æ¯æ ææ°æ®ï¼è¿å0æä½¿ç¨ç¹æ®æ è¯ |
| | | return 0; |
| | | } |
| | | } |
| | | else |
| | |
| | | else |
| | | { |
| | | // 大端ï¼é«åèå¨åï¼é»è®¤ï¼ |
| | | bytes.Add((byte)((register >> 8) & 0xFF)); |
| | | bytes.Add((byte)(register & 0xFF)); |
| | | // 注æï¼æ ¹æ®å®é
PLCæ°æ®ï¼åèé¡ºåºæ¯åç |
| | | var highByte = (byte)((register >> 8) & 0xFF); |
| | | var lowByte = (byte)(register & 0xFF); |
| | | |
| | | // å
æ·»å ä½åèï¼åæ·»å é«åèï¼éåºPLCçåèåºï¼ |
| | | if (lowByte != 0) bytes.Add(lowByte); |
| | | if (highByte != 0) bytes.Add(highByte); |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | try |
| | | { |
| | | // å
è§£æä¸ºå符串 |
| | | var timestampString = ParseString(registers, config); |
| | | // æ¶é´æ³æ°æ®éè¦ç¹æ®è§£æï¼æ°ååç¬¦ï¼ |
| | | var timestampString = ParseTimestampString(registers, config); |
| | | |
| | | if (string.IsNullOrEmpty(timestampString)) |
| | | { |
| | |
| | | #region æ¶é´æ³è§£æè¾
婿¹æ³ |
| | | |
| | | /// <summary> |
| | | /// è§£ææ¶é´æ³å符串ï¼é对æ°ååç¬¦æ°æ®ï¼ |
| | | /// </summary> |
| | | private static string ParseTimestampString(int[] registers, DataField config) |
| | | { |
| | | if (registers.Length == 0) return string.Empty; |
| | | |
| | | var chars = new List<char>(); |
| | | |
| | | foreach (var register in registers.Take(config.Length)) |
| | | { |
| | | if (register == 0) break; // éå°0å¯åå¨åæ¢ |
| | | |
| | | // æåé«åèåä½åè |
| | | var highByte = (byte)((register >> 8) & 0xFF); |
| | | var lowByte = (byte)(register & 0xFF); |
| | | |
| | | // æPLCæ°æ®æ ¼å¼æ·»å å符ï¼å
ä½åèï¼åé«åèï¼ |
| | | // æ£æ¥æ¯å¦ä¸ºæ°åå符ï¼ASCII 48-57, '0'-'9'ï¼ |
| | | if (lowByte >= 48 && lowByte <= 57) |
| | | { |
| | | chars.Add((char)lowByte); |
| | | } |
| | | if (highByte >= 48 && highByte <= 57) |
| | | { |
| | | chars.Add((char)highByte); |
| | | } |
| | | } |
| | | |
| | | var result = new string(chars.ToArray()); |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è§£æYYYYMMDDHHMMSSæ ¼å¼çæ¶é´æ³ |
| | | /// </summary> |
| | | private static DateTime ParseTimestampYYYYMMDDHHMMSS(string timestampString) |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | --åå§å¼ |
| | | {"PlcHeartbeat":[1],"DataReady":[1],"ProductModel":[25185,25699,26213,26727,27241,12849,13363,13877,14391,12345],"TestStation":[1],"ProductCode":[25185,25699,26213,26727,27241,12849,13363,13877,14391,12345],"TestResult":[1],"Timestamp":[12338,13618,14128,14641,13105,12340,0],"MinInstallSize":[-7616,1],"MaxInstallSize":[-7616,1],"Stroke":[-7616,1],"Speed":[-7616,1],"WorkingVoltage":[-7616,1],"WorkingCurrent":[-7616,1],"WorkingPressure":[-7616,1],"UpHallSensor":[-7616,1]} |
| | | |
| | | --é¨åç®æ å¼ |
| | | --å符串å
å¡«çæ¯abcdefghij1234567890 |
| | | --æ´åå
æ¯12345ï¼å°±æ¯123.45ã |
| | | --æ¥ææ¯202507191340å符串 |