小能豆

C# 与三菱plc 读取报错

javascript

错误代号:10000
文本描述:PLC反馈报文的和校验失败! Actua:02 30 31 30 30 33 43 30 30 36 39 30 3130 30 30 30 31 45 30 30 31 32 30 30 34 38 45 31 42 41 34

就是下图这里报错

OperateResult Read_res = FxSeriaal.ReadUInt16(“D59” , 10):’


阅读 158

收藏
2024-06-11

共1个答案

小能豆

根据你提供的错误信息“PLC反馈报文的和校验失败!”以及示例代码OperateResult<ushort[]> Read_res = FxSeriaal.ReadUInt16("D59", 10);,这是在读取PLC数据时发生的校验错误。这个错误通常意味着从PLC收到的数据包在传输过程中损坏或不完整。

可能的原因和解决方法

  1. 数据包损坏或不完整
  2. 检查连接:确保PLC与计算机之间的通信连接良好,检查连接线是否有损坏。
  3. 减少干扰:在通信环境中减少电磁干扰,避免在通信过程中产生噪声。

  4. 校验和错误

  5. 重新发送请求:有时重新发送请求可以解决由于暂时性问题导致的校验和错误。
  6. 检查数据包格式:确保发送和接收的数据包格式正确,并且所有数据都被正确解析。

  7. 串口设置

  8. 波特率匹配:确保计算机和PLC的波特率设置匹配。
  9. 校验位、停止位和数据位:确保这些串口参数在计算机和PLC两端一致。

示例代码和配置检查

首先,检查你的代码配置和连接是否正确。

示例代码

// 假设你使用的是HslCommunication库来进行PLC通信
using HslCommunication;
using HslCommunication.Profinet.Melsec;
using System;

class Program
{
    static void Main(string[] args)
    {
        MelsecFxSerial FxSerial = new MelsecFxSerial();
        FxSerial.SerialPortInni(sp =>
        {
            sp.PortName = "COM1"; // 根据实际情况修改
            sp.BaudRate = 9600;   // 根据实际情况修改
            sp.DataBits = 8;
            sp.StopBits = System.IO.Ports.StopBits.One;
            sp.Parity = System.IO.Ports.Parity.None;
        });

        OperateResult connect = FxSerial.Open();
        if (connect.IsSuccess)
        {
            OperateResult<ushort[]> Read_res = FxSerial.ReadUInt16("D59", 10);
            if (Read_res.IsSuccess)
            {
                ushort[] values = Read_res.Content;
                foreach (ushort value in values)
                {
                    Console.WriteLine(value);
                }
            }
            else
            {
                Console.WriteLine($"读取失败: {Read_res.Message}");
            }
        }
        else
        {
            Console.WriteLine($"连接失败: {connect.Message}");
        }

        FxSerial.Close();
    }
}

串口配置检查

确保PLC的串口配置(波特率、数据位、停止位和校验位)与代码中的配置一致。

捕获和分析反馈报文

如果仍然有问题,可以捕获并分析PLC反馈的具体报文。这有助于了解问题的根本原因。

// 在读取之前加入调试信息,捕获并显示实际接收到的报文
OperateResult<ushort[]> Read_res = FxSerial.ReadUInt16("D59", 10);
if (Read_res.IsSuccess)
{
    ushort[] values = Read_res.Content;
    foreach (ushort value in values)
    {
        Console.WriteLine(value);
    }
}
else
{
    // 显示详细错误信息
    Console.WriteLine($"读取失败: {Read_res.Message}");
    if (Read_res.ErrorCode == 10000)
    {
        // 显示实际接收到的报文
        Console.WriteLine("实际接收到的报文: " + BitConverter.ToString(Read_res.Content));
    }
}

总结

检查和解决校验和错误,主要包括确保通信环境和设备设置正确。如果这些问题仍然存在,捕获详细的反馈报文可以帮助更好地定位问题。

2024-06-11