自学内容网 自学内容网

上位机通讯汇川Plc3U和5U

开发过程中需要调用到汇川官网的两个动态库(ModbusTcpAPI.dll;StandardModbusApi.dll)

解压完成后找到上面的动态库复制到自己项目的根目录下面然后就可以进行下一步操作了

UI界面:

通讯类集成了3U和5U的连接断开以及读写方法:

public class InovancePlc : PLCBase
{
    private InovancePlc _HuiChuan5U;
    #region //标准库
    [DllImport("StandardModbusApi.dll", EntryPoint = "Init_ETH_String", CallingConvention = CallingConvention.Cdecl)]
    public static extern bool Init_ETH_String(string sIpAddr, int nNetId = 0, int IpPort = 502);

    [DllImport("StandardModbusApi.dll", EntryPoint = "Exit_ETH", CallingConvention = CallingConvention.Cdecl)]
    public static extern bool Exit_ETH(int nNetId = 0);

    [DllImport("StandardModbusApi.dll", EntryPoint = "H5u_Write_Soft_Elem", CallingConvention = CallingConvention.Cdecl)]
    public static extern int H5u_Write_Soft_Elem(SoftElemType eType, int nStartAddr, int nCount, byte[] pValue, int nNetId = 0);

    [DllImport("StandardModbusApi.dll", EntryPoint = "H5u_Read_Soft_Elem", CallingConvention = CallingConvention.Cdecl)]
    public static extern int H5u_Read_Soft_Elem(SoftElemType eType, int nStartAddr, int nCount, byte[] pValue, int nNetId = 0);

    [DllImport("StandardModbusApi.dll", EntryPoint = "H5u_Read_Device_Block", CallingConvention = CallingConvention.Cdecl)]
    public static extern int H5u_Read_Device_Block(SoftElemType eType, int nStartAddr, int nCount, byte[] pValue, int nNetId = 0);

    [DllImport("StandardModbusApi.dll", EntryPoint = "H5u_Write_Device_Block", CallingConvention = CallingConvention.Cdecl)]
    public static extern int H5u_Write_Device_Block(SoftElemType eType, int nStartAddr, int nCount, byte[] pValue, int nNetId = 0);


    [DllImport("StandardModbusApi.dll", EntryPoint = "H3u_Read_Soft_Elem", CallingConvention = CallingConvention.Cdecl)]
    public static extern int H3u_Read_Soft_Elem(SoftElemType eType, int nStartAddr, int nCount, byte[] pValue, int nNetId = 0);

    [DllImport("StandardModbusApi.dll", EntryPoint = "H3u_Write_Soft_Elem", CallingConvention = CallingConvention.Cdecl)]
    public static extern int H3u_Write_Soft_Elem(SoftElemType eType, int nStartAddr, int nCount, byte[] pValue, int nNetId = 0);

    #endregion

    int[] Result = new int[1];
    int nNetId = 1;
    private MyModbusSlave.ErrorMsgEventHandler _ErrorMsgEventHandler;
    public InovancePlc()
        : base()
    {
        if (ECom.Plc5Utype)
        {
            this.PLCVender = PLCType.HuiChuan5U;
        }

        if (ECom.Plc3Utype)
        {
            this.PLCVender = PLCType.HuiChuan3U;
        }
        
    }
    /// <summary>
    /// 连接PLC
    /// </summary>
    /// <returns></returns>
    public override bool Connect()
    {
        try
        {
            if (ECom.Plc5Utype)
            {
                return CreateConnection();
            }
            
            if(ECom.Plc3Utype)
            {
                return CreateConnection1();
            }
            return false;
        }
        catch (Exception ex)
        {
            this.OnTcpClientErrorMsgEnterHead("错误信息:" + ex.Message);
            AddLog.Error("错误信息:" + ex.Message);
            return false;
        }
       
    }

    private bool CreateConnection()
    {
        if(IsConnected)
            return true;
        try
        {
            bool result = Init_ETH_String(IpAddress, 0, Convert.ToInt32(Port));
            if (result == true)
            {
                IsConnected = true;
                AddLog.Info("汇川5U_PlC网口连接成功!");
                return true;
            }
            else
            {
                IsConnected = false;
                AddLog.Info("汇川5U_PlC网口连接失败!");
                return false;
            }
        }
        catch (Exception ex)
        {
            IsConnected = false;
            AddLog.Error("汇川5U_PlC网口连接失败!" + ex.Message);
            return false;
        }
    }
    private bool CreateConnection1()
    {
        if (IsConnected)
            return true;
        try
        {
            bool result = Init_ETH_String(IpAddress, nNetId, Convert.ToInt32(Port));
            if (result == true)
            {
                IsConnected = true;
                AddLog.Info("汇川3U_PlC网口连接成功!");
                return true;
            }
            else
            {
                IsConnected = false;
                AddLog.Info("汇川3U_PlC网口连接失败!");
                return false;
            }
        }
        catch (Exception ex)
        {
            IsConnected = false;
            AddLog.Error("汇川3U_PlC网口连接失败!" + ex.Message);
            return false;
        }
    }
    /// <summary>
    /// 关闭连接
    /// </summary>
    public override void DisConnect()
    {
        if (ECom.Plc5Utype)
        {
            IsConnected = false;
            int nNetId = 0;
            bool result = Exit_ETH(nNetId);
        }
        if (ECom.Plc3Utype)
        {
            IsConnected = false;
            bool result = Exit_ETH(nNetId);
        }

    }
    [Category("ModbusTcp事件")]
    [Description("返回错误消息事件")]
    public event MyModbusSlave.ErrorMsgEventHandler OnErrorMsg
    {
        add
        {
            MyModbusSlave.ErrorMsgEventHandler errorMsgEventHandler = this._ErrorMsgEventHandler;
            MyModbusSlave.ErrorMsgEventHandler temp;
            do
            {
                temp = errorMsgEventHandler;
                MyModbusSlave.ErrorMsgEventHandler value2 = (MyModbusSlave.ErrorMsgEventHandler)Delegate.Combine(temp, value);
                errorMsgEventHandler = Interlocked.CompareExchange<MyModbusSlave.ErrorMsgEventHandler>(ref this._ErrorMsgEventHandler, value2, temp);
            }
            while (errorMsgEventHandler != temp);
        }
        remove
        {
            MyModbusSlave.ErrorMsgEventHandler errorMsgEventHandler = this._ErrorMsgEventHandler;
            MyModbusSlave.ErrorMsgEventHandler temp;
            do
            {
                temp = errorMsgEventHandler;
                MyModbusSlave.ErrorMsgEventHandler value2 = (MyModbusSlave.ErrorMsgEventHandler)Delegate.Remove(temp, value);
                errorMsgEventHandler = Interlocked.CompareExchange<MyModbusSlave.ErrorMsgEventHandler>(ref this._ErrorMsgEventHandler, value2, temp);
            }
            while (errorMsgEventHandler != temp);
        }
    }
    protected virtual void OnTcpClientErrorMsgEnterHead(string msg)
    {
        if (this._ErrorMsgEventHandler != null)
        {
            this._ErrorMsgEventHandler(msg);
        }
    }
    object LockPlc = new object();

    #region 读写方法

    /// <summary>
    /// 重写读值方法
    /// </summary>
    /// <param name=

原文地址:https://blog.csdn.net/weixin_67299857/article/details/142595692

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!