上位机通讯汇川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);#endregionint[] 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="Type">值的类型</param>/// <param name="Address">地址</param>/// <param name="Length">值的长度</param>/// <param name="Value">值</param>/// <returns></returns>public  bool ReadIn161(string Type, string Address, int Length, out int Value){lock (LockPlc){Value = -1;try{Result = new int[1] { 0 };bool bresult = ReadDInt32(Type, Address, Length, out Result);if (bresult){if (Result != null){Value = Result[0];AddLog.Info("5UPlc读取数据:"+Value);}return true;}else{return false;}}catch (Exception ex){AddLog.Error("读取5UPLC失败:"+ ex.ToString());return false;}}}/// <summary>/// 重写的写值方法/// </summary>/// <param name="Type">值的类型(D或M)</param>/// <param name="Address">地址</param>/// <param name="Value">值</param>/// <returns></returns>public  bool WriteIn16(string Type, string Address, int Value){lock (LockPlc){try{bool aaa = WriteDInt32(Type, Address, Value);AddLog.Info("5UPlc写入成功:" + aaa);return aaa;}catch (Exception ex){MessageBox.Show("5UPLC写值失败" + ex.ToString());return false;}}}#endregion#region 3U读写方法/// <summary>/// plc3u读/// </summary>/// <param name="address"></param>/// <returns></returns>public int ReadSingle32(string address){try{var temp = new short[2];ReadBlock16(address, ref temp);var tempByte = new List<byte>();tempByte.AddRange(BitConverter.GetBytes(temp[0]));tempByte.AddRange(BitConverter.GetBytes(temp[1]));return BitConverter.ToInt32(tempByte.ToArray(), 0);}catch (Exception ex){MessageBox.Show("PLC Read Fail:" + address);return -999;}}/// <summary>/// plc3u写/// </summary>/// <param name="address"></param>/// <param name="value"></param>/// <returns></returns>public bool WriteSingle16(string address, int value){try{var temp = new short[] { (short)value };WriteBlock16(address, temp);return true;}catch (Exception ex){MessageBox.Show("PLC Read Fail:" + address);return false;}}public void ReadBlock16(string startAddress, ref short[] addressValues){var addrType = startAddress.Substring(0, 1);var startAddr = Convert.ToInt32(startAddress.Substring(1, startAddress.Length - 1));byte[] pBuf = new byte[16000];int nCount = addressValues.Length;int nRet = H3u_Read_Soft_Elem(GetAddrTypeByte(addrType), startAddr, nCount, pBuf, nNetId);for (int i = 0; i < addressValues.Length; i++){addressValues[i] = pBuf[i];}}public void WriteBlock16(string startAddress, short[] addressValues){var addrType = startAddress.Substring(0, 1);var startAddr = Convert.ToInt32(startAddress.Substring(1, startAddress.Length - 1));int nCount = addressValues.Length;var sendByte = new List<byte>();for (int i = 0; i < addressValues.Length; i++){sendByte.AddRange(BitConverter.GetBytes(addressValues[i]));}int nRet = H3u_Write_Soft_Elem(GetAddrTypeByte(addrType), startAddr, nCount, sendByte.ToArray(), nNetId);}private SoftElemType GetAddrTypeByte(string addrType){switch (addrType){case "X": return SoftElemType.REGI_H3U_X;case "Y": return SoftElemType.REGI_H3U_Y;case "M": return SoftElemType.REGI_H3U_M;case "D": return SoftElemType.REGI_H3U_DW;case "R": return SoftElemType.REGI_H3U_R;default: return SoftElemType.REGI_H3U_SM;}}#endregionpublic override bool ReadInt16(string memoryType, string address, int length, out short[] results){lock (LockPlc){results = new short[] { };string _address = memoryType + address;//缓冲区。读取整型字元件则一个元件占两个byte,位元件则占一个byte。例如读取D元件500个,则缓冲区大小为1000以上byte[] pBuf = new byte[16000];int nStartAddr = Convert.ToInt32(address);int nCount = Convert.ToInt32(length);bool bIsWord = false;//是否字元件SoftElemType ElemType = SoftElemType.REGI_H5U_M;if (memoryType == "Y"){ElemType = SoftElemType.REGI_H5U_Y;}else if (memoryType == "X"){ElemType = SoftElemType.REGI_H5U_X;}else if (memoryType == "S"){ElemType = SoftElemType.REGI_H5U_S;}else if (memoryType == "M"){ElemType = SoftElemType.REGI_H5U_M;}else if (memoryType == "B"){ElemType = SoftElemType.REGI_H5U_B;}else if (memoryType == "D"){bIsWord = true;ElemType = SoftElemType.REGI_H5U_D;}else if (memoryType == "R"){bIsWord = true;ElemType = SoftElemType.REGI_H5U_R;}int nRet = H5u_Read_Device_Block(ElemType, nStartAddr, nCount, pBuf, 0);if (nRet != 1){return false;}List<short> arr = new List<short>();string strData = "";for (int i = 0; i < nCount; i++){if (bIsWord){byte[] databuf = new byte[2] { 0, 0 };databuf[0] = pBuf[i * 2];databuf[1] = pBuf[i * 2 + 1];short iTemp = BitConverter.ToInt16(databuf, 0);arr.Add(iTemp);}else{int nVal = 0;nVal = pBuf[i];strData = strData + nVal.ToString();arr.Add(Convert.ToInt16(strData));}}if (arr != null){results = new short[arr.Count];for (int i = 0; i < arr.Count; i++){results[i] = arr[i];}return true;}else{return false;}}}public override bool ReadDInt32(string memoryType, string address, int length, out int[] results){lock (LockPlc){results = new int[] { };string _address = memoryType + address;//缓冲区。读取整型字元件则一个元件占两个byte,位元件则占一个byte。例如读取D元件500个,则缓冲区大小为1000以上byte[] pBuf = new byte[16000];int nStartAddr = Convert.ToInt32(address);int nCount = Convert.ToInt32(length);bool bIsWord = false;//是否字元件SoftElemType ElemType = SoftElemType.REGI_H5U_M;if (memoryType == "Y"){ElemType = SoftElemType.REGI_H5U_Y;}else if (memoryType == "X"){ElemType = SoftElemType.REGI_H5U_X;}else if (memoryType == "S"){ElemType = SoftElemType.REGI_H5U_S;}else if (memoryType == "M"){ElemType = SoftElemType.REGI_H5U_M;}else if (memoryType == "B"){ElemType = SoftElemType.REGI_H5U_B;}else if (memoryType == "D"){bIsWord = true;ElemType = SoftElemType.REGI_H5U_D;}else if (memoryType == "R"){bIsWord = true;ElemType = SoftElemType.REGI_H5U_R;}int nRet = H5u_Read_Device_Block(ElemType, nStartAddr, nCount, pBuf, 0);if (nRet != 1){return false;}//     nCount = nCount / 2;List<int> arr = new List<int>();string strData = "";for (int i = 0; i < nCount; i++){if (bIsWord){byte[] databuf = new byte[4] { 0, 0, 0, 0 };databuf[0] = pBuf[i * 4];databuf[1] = pBuf[i * 4 + 1];databuf[2] = pBuf[i * 4 + 2];databuf[3] = pBuf[i * 4 + 3];int iTemp = BitConverter.ToInt32(databuf, 0);arr.Add(iTemp);}else{int nVal = 0;nVal = pBuf[i];strData = strData + nVal.ToString();arr.Add(Convert.ToInt16(strData));}}if (arr != null){results = new int[arr.Count];for (int i = 0; i < arr.Count; i++){results[i] = arr[i];}return true;}else{return false;}}}public override bool ReadReal32(string memoryType, string address, int length, out float[] results){lock (LockPlc){results = new float[] { };string _address = memoryType + address;//缓冲区。读取整型字元件则一个元件占两个byte,位元件则占一个byte。例如读取D元件500个,则缓冲区大小为1000以上byte[] pBuf = new byte[16000];int nStartAddr = Convert.ToInt32(address);int nCount = Convert.ToInt32(length);bool bIsWord = false;//是否字元件SoftElemType ElemType = SoftElemType.REGI_H5U_M;if (memoryType == "Y"){ElemType = SoftElemType.REGI_H5U_Y;}else if (memoryType == "X"){ElemType = SoftElemType.REGI_H5U_X;}else if (memoryType == "S"){ElemType = SoftElemType.REGI_H5U_S;}else if (memoryType == "M"){ElemType = SoftElemType.REGI_H5U_M;}else if (memoryType == "B"){ElemType = SoftElemType.REGI_H5U_B;}else if (memoryType == "D"){bIsWord = true;ElemType = SoftElemType.REGI_H5U_D;}else if (memoryType == "R"){bIsWord = true;ElemType = SoftElemType.REGI_H5U_R;}int nRet = H5u_Read_Device_Block(ElemType, nStartAddr, nCount, pBuf, 0);if (nRet != 1){return false;}List<float> arr = new List<float>();string strData = "";//      nCount = nCount / 2;for (int i = 0; i < nCount; i++){if (bIsWord){byte[] databuf = new byte[4] { 0, 0, 0, 0 };databuf[0] = pBuf[i * 4];databuf[1] = pBuf[i * 4 + 1];databuf[2] = pBuf[i * 4 + 2];databuf[3] = pBuf[i * 4 + 3];float iTemp = BitConverter.ToSingle(databuf, 0);arr.Add(iTemp);}else{int nVal = 0;nVal = pBuf[i];strData = strData + nVal.ToString();arr.Add(Convert.ToInt16(strData));}}if (arr != null){results = new float[arr.Count];for (int i = 0; i < arr.Count; i++){results[i] = arr[i];}return true;}else{return false;}}}public override bool WriteDInt32(string memoryType, string address, int val){lock (LockPlc){string _address = memoryType + address;byte[] pBuf = new byte[16000];int nStartAddr = Convert.ToInt32(address);int nCount = 1;bool bIsWord = false;//是否字元件SoftElemType ElemType = SoftElemType.REGI_H5U_M;if (memoryType == "Y"){ElemType = SoftElemType.REGI_H5U_Y;}else if (memoryType == "X"){ElemType = SoftElemType.REGI_H5U_X;}else if (memoryType == "S"){ElemType = SoftElemType.REGI_H5U_S;}else if (memoryType == "M"){ElemType = SoftElemType.REGI_H5U_M;}else if (memoryType == "B"){ElemType = SoftElemType.REGI_H5U_B;}else if (memoryType == "D"){bIsWord = true;ElemType = SoftElemType.REGI_H5U_D;}else if (memoryType == "R"){bIsWord = true;ElemType = SoftElemType.REGI_H5U_R;}GetDataFromUI(pBuf, val.ToString(), bIsWord, 1);int nRet = H5u_Write_Device_Block(ElemType, nStartAddr, nCount, pBuf, 0);if (nRet != 1){return false;}else{return true;}}}public override bool WriteReal32(string memoryType, string address, float val){lock (LockPlc){string _address = memoryType + address;byte[] pBuf = new byte[16000];int nStartAddr = Convert.ToInt32(address);int nCount = 1;bool bIsWord = false;//是否字元件SoftElemType ElemType = SoftElemType.REGI_H5U_M;if (memoryType == "Y"){ElemType = SoftElemType.REGI_H5U_Y;}else if (memoryType == "X"){ElemType = SoftElemType.REGI_H5U_X;}else if (memoryType == "S"){ElemType = SoftElemType.REGI_H5U_S;}else if (memoryType == "M"){ElemType = SoftElemType.REGI_H5U_M;}else if (memoryType == "B"){ElemType = SoftElemType.REGI_H5U_B;}else if (memoryType == "D"){bIsWord = true;ElemType = SoftElemType.REGI_H5U_D;}else if (memoryType == "R"){bIsWord = true;ElemType = SoftElemType.REGI_H5U_R;}GetDataFromUI(pBuf, val.ToString(), bIsWord, 2);int nRet = H5u_Write_Device_Block(ElemType, nStartAddr, nCount, pBuf, 0);if (nRet != 1){return false;}else{return true;}}}public override bool WriteInt16(string memoryType, string address, short val){lock (LockPlc){string _address = memoryType + address;byte[] pBuf = new byte[16000];int nStartAddr = Convert.ToInt32(address);int nCount = 1;bool bIsWord = false;//是否字元件SoftElemType ElemType = SoftElemType.REGI_H5U_M;if (memoryType == "Y"){ElemType = SoftElemType.REGI_H5U_Y;}else if (memoryType == "X"){ElemType = SoftElemType.REGI_H5U_X;}else if (memoryType == "S"){ElemType = SoftElemType.REGI_H5U_S;}else if (memoryType == "M"){ElemType = SoftElemType.REGI_H5U_M;}else if (memoryType == "B"){ElemType = SoftElemType.REGI_H5U_B;}else if (memoryType == "D"){bIsWord = true;ElemType = SoftElemType.REGI_H5U_D;}else if (memoryType == "R"){bIsWord = true;ElemType = SoftElemType.REGI_H5U_R;}GetDataFromUI(pBuf, val.ToString(), bIsWord, 0);int nRet = H5u_Write_Device_Block(ElemType, nStartAddr, nCount, pBuf, 0);if (nRet != 1){return false;}else{return true;}}}private void GetDataFromUI(byte[] pBuf, string arr, bool bIsWord, int nDataType){for (int i = 0; i < arr.Length; i++){if (arr == string.Empty){break;}double nVal = Convert.ToDouble(arr);if (bIsWord){if (nDataType == 0)//16位整形{int idata = Convert.ToInt16(arr);byte[] dataBuf = new byte[2] { 0, 0 };dataBuf = BitConverter.GetBytes(idata);pBuf[2 * i] = dataBuf[0];pBuf[2 * i + 1] = dataBuf[1];}else if (nDataType == 1)//32位整形{int idata = Convert.ToInt32(arr);byte[] dataBuf = new byte[4] { 0, 0, 0, 0 };dataBuf = BitConverter.GetBytes(idata);pBuf[4 * i] = dataBuf[0];pBuf[4 * i + 1] = dataBuf[1];pBuf[4 * i + 2] = dataBuf[2];pBuf[4 * i + 3] = dataBuf[3];}else if (nDataType == 2)//浮点数{float fdata = Convert.ToSingle(arr);byte[] dataBuf = new byte[4] { 0, 0, 0, 0 };dataBuf = BitConverter.GetBytes(fdata);pBuf[4 * i] = dataBuf[0];pBuf[4 * i + 1] = dataBuf[1];pBuf[4 * i + 2] = dataBuf[2];pBuf[4 * i + 3] = dataBuf[3];}}else{pBuf[i] = (byte)nVal;}}}public enum SoftElemType{//AM600ELEM_QX = 0,     //QX元件ELEM_MW = 1,     //MW元件ELEM_X = 2,      //X元件(对应QX200~QX300)ELEM_Y = 3,      //Y元件(对应QX300~QX400)//H3UREGI_H3U_Y = 0x20,       //Y元件的定义	REGI_H3U_X = 0x21,      //X元件的定义							REGI_H3U_S = 0x22,      //S元件的定义				REGI_H3U_M = 0x23,      //M元件的定义							REGI_H3U_TB = 0x24,     //T位元件的定义				REGI_H3U_TW = 0x25,     //T字元件的定义				REGI_H3U_CB = 0x26,     //C位元件的定义				REGI_H3U_CW = 0x27,     //C字元件的定义				REGI_H3U_DW = 0x28,     //D字元件的定义				REGI_H3U_CW2 = 0x29,        //C双字元件的定义REGI_H3U_SM = 0x2a,     //SMREGI_H3U_SD = 0x2b,     //REGI_H3U_R = 0x2c,      ////H5uREGI_H5U_Y = 0x30,       //Y元件的定义	REGI_H5U_X = 0x31,      //X元件的定义							REGI_H5U_S = 0x32,      //S元件的定义				REGI_H5U_M = 0x33,      //M元件的定义	REGI_H5U_B = 0x34,       //B元件的定义REGI_H5U_D = 0x35,       //D字元件的定义REGI_H5U_R = 0x36,       //R字元件的定义}

Base基础类:

    public class PLCBase{//走串口通信相关参数protected SerialPort _comPort;public string ComPortName;public int BaudRate;public int DataBits;public Parity ComParity;public StopBits ComStopBits;public int StationNo;//走网络通信相关参数public string IpAddress;public string Port;//基本参数/// <summary>/// 是否走网络/// </summary>public bool IsEthernetType;/// <summary>/// 描述/// </summary>public string Description;/// <summary>/// 是否处于连接状态/// </summary>public bool IsConnected;/// <summary>/// 类型/// </summary>public PLCType PLCVender;public PLCBase(){}public virtual bool Connect(){return false;}public virtual void DisConnect(){}public virtual bool ReadBit(string memoryType, string address, out bool result){result = false;return false;}public virtual bool ReadByte(string memoryType, string address, int length, out byte[] results){results = new byte[1] { 0 };return false;}public virtual bool ReadInt16(string memoryType, string address, int length, out short[] results){results = new short[1] { 0 };return false;}public virtual bool ReadUInt16(string memoryType, string address, int length, out ushort[] results){results = new ushort[1] { 0 };return false;}public virtual bool ReadDInt32(string memoryType, string address, int length, out int[] results){results = new int[1] { 0 };return false;}public virtual bool ReadReal32(string memoryType, string address, int length, out float[] results){results = new float[1] { 0f };return false;}public virtual bool WriteBit(string memoryType, string address, bool onoff){return false;}public virtual bool WriteInt16(string memoryType, string address, short val){return false;}public virtual bool WriteUInt16(string memoryType, string address, ushort val){return false;}public virtual bool WriteDInt32(string memoryType, string address, int val){return false;}public virtual bool WriteReal32(string memoryType, string address, float val){return false;}public virtual bool WriteBit(string memoryType, string address, bool[] onoff){return false;}public virtual bool WriteInt16(string memoryType, string address, short[] val){return false;}public virtual bool WriteUInt16(string memoryType, string address, ushort[] val){return false;}public virtual bool WriteDInt32(string memoryType, string address, int[] val){return false;}public virtual bool WriteReal32(string memoryType, string address, float[] val){return false;}public virtual void ToXmlNode(out Dictionary<string, object> attributes, out Dictionary<string, object> nodes){attributes = new Dictionary<string, object>();nodes = new Dictionary<string, object>();}/// <summary>/// 从XML结点获取/// </summary>public virtual void FromXmlNode(XmlNode node){}}public enum PLCType{HuiChuan5U,HuiChuan3U,SimensePLC,OmronFinsTcpPLC,MelsecPLC,MelsecPLC3UModbus,MelsecPLC3GAModbus,MelsecPLC5UNet,}}

实例调用类

  private void btn_WriteDate_Click(object sender, EventArgs e){if (ckPlc5U.Checked){try{if (!string.IsNullOrWhiteSpace(TxtAddress.Text) && !string.IsNullOrWhiteSpace(TxtValue.Text) && !string.IsNullOrWhiteSpace(SltType.Text)){try{ECom.Plc5UWrite(SltType.Text, TxtAddress.Text, int.Parse(TxtValue.Text));}catch (Exception ex){AddLog.Error("Plc写入出错:" + ex.Message);return;}}else{if (form == null){MessageBox.Show("Plc种类、地址、值不能为空!");}else{AntdUI.Message.error(form, "Plc种类、地址、值不能为空!", Font);}}}catch (Exception ex){AddLog.Info("Plc写入出错" + ex.Message);return;}}if(ckPlc3U.Checked){try{if (!string.IsNullOrWhiteSpace(TxtAddress.Text) && !string.IsNullOrWhiteSpace(TxtValue.Text)){try{ECom.Plc3UWrite(TxtAddress.Text, int.Parse(TxtValue.Text));}catch (Exception ex){AddLog.Error("Plc3U写入出错:" + ex.Message);return;}}else{if (form == null){MessageBox.Show("Plc3U地址、值不能为空!");}else{AntdUI.Message.error(form, "Plc3U地址、值不能为空!", Font);}}}catch (Exception ex){AddLog.Info("Plc3U写入出错" + ex.Message);return;}}}private async void btn_ReadDate_Click(object sender, EventArgs e){if (ckPlc5U.Checked){try{await Task.Run(() => ECom.Plc5URead(SltType.Text, TxtAddress.Text, int.Parse(TxtLength.Text), int.Parse(TxtValue.Text)));}catch (Exception ex){AddLog.Error("Plc5U读取出错:" + ex.Message);return;}}if (ckPlc3U.Checked){try{await Task.Run(() => ECom.Plc3URead(TxtAddress.Text));}catch (Exception ex){AddLog.Error("Plc3U读取出错:" + ex.Message);return;}}} #region 汇川plc读写数据public static void Plc5URead(string Type, string address ,int Length,int value){inovancePlc.ReadIn161(Type, address, Length, out value);}public static void Plc5UWrite(string Type, string address ,int value){inovancePlc.WriteIn16(Type, address, value);}public static void Plc3URead(string Address){inovancePlc.ReadSingle32(Address).ToString();}public static void Plc3UWrite(string Address,int value){inovancePlc.WriteSingle16(Address,value).ToString();}#endregion

下载动态库可参考本文链接:C#汇川PLC通讯_c#与汇川plc通信-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1548979.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

如何巧妙运用Shell变量:掌握脚本编程的核心技巧

目录 前言一、Shell变量——变量类型1、用户自定义变量2、环境变量用./ 启动脚本文件记得加权限哦 二、Shell变量——变量赋值和访问(一&#xff09;变量定义(二&#xff09;变量的使用(三&#xff09;删除变量(四&#xff09;添加环境变量(五&#xff09;内部变量(六&#xff…

开源链动2+1模式AI智能名片小程序源码:放大特色,构建独特竞争力

摘要&#xff1a;本文探讨在当今社会背景下&#xff0c;开源链动21模式AI智能名片小程序源码如何通过坚持与众不同来构建独特竞争力。在信息传播便捷但个体易同质化的时代&#xff0c;拥有特色是脱颖而出的关键&#xff0c;而这种模式下的小程序源码具有独特的发展潜力。 一、引…

有效解决配置管理混乱,麒麟桌面操作系统V10 sp1 2403最新版本推出统一配置系统

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 当前桌面操作系统中可通过配置定义的应用有限&a…

使用 Git 帮助文档

聊聊如何更好地查阅官方文档。 ‍ git help 学习某个工具&#xff0c;官方文档是少不了的&#xff0c;也是最权威的。我们可以使用 git help 来查看帮助&#xff0c;该命令会列举出常用的命令和介绍&#xff1a; > git help usage: git [--version] [--help] [-C <pa…

十一假期地区人流量出行大数据分析:技术驱动下的深度洞察

随着国庆黄金周的临近&#xff0c;旅游市场再次迎来了一年一度的出行高峰。在这个数字化时代&#xff0c;如何利用大数据、第三方接口等先进技术进行数据采集与分析&#xff0c;以更精准地预测人流量、优化资源配置、提升旅游体验&#xff0c;成为了行业内外关注的焦点。 一、…

VGA/HDMI/DP接口和USB、串口通信协议

1、视频接口 开始之前我们先聊一聊数字信号和模拟信号&#xff0c;模拟信号和数字信号的不同之处在于它们所传输的信息的形式。模拟信号是一个连续的信号&#xff0c;可以以在无限小的时间内进行测量。数字信号则是以离散的形式进行传输&#xff0c;它的数值只能是离散的、有限…

net core mvc 数据绑定 《1》

其它的绑定 跟net mvc 一样 》》MVC core 、framework 一样 1 模型绑定数组类型 2 模型绑定集合类型 3 模型绑定复杂的集合类型 4 模型绑定源 》》》》 模型绑定 使用输入数据的原生请求集合是可以工作的【request[],Querystring,request.from[]】&#xff0c; 但是从可读…

Python 从入门到实战30(高级文件的操作)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了操作目录的相关知识。今天我们将学习一下高级文…

MySQl查询分析工具 EXPLAIN ANALYZE

文章目录 EXPLAIN ANALYZE是什么Iterator 输出内容解读EXPLAIN ANALYZE和EXPLAIN FORMATTREE的区别单个 Iterator 内容解读 案例分析案例1 文件排序案例2 简单的JOIN查询 参考资料&#xff1a;https://hackmysql.com/book-2/ EXPLAIN ANALYZE是什么 EXPLAIN ANALYZE是MySQL8.…

SSM+Vue社区物业管理系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质创作…

高级前端进阶:揭秘 MemFire Cloud 的强大助力

在前端开发的道路上&#xff0c;我们总是在追求效率与速度的平衡&#xff0c;如何写出优雅的代码&#xff0c;如何让开发流程更加顺滑成为了每个前端开发者的目标。对于那些希望提升效率、减少繁琐开发步骤的开发者来说&#xff0c;MemFire Cloud&#xff0c;一款国产的一站式应…

Java生成Markdown格式内容

前一篇写的是markdown格式的文本内容转换保存为word文档&#xff0c;是假定已经有一个现成的markdown格式的文本&#xff0c;然后直接转换保存为word文档&#xff0c;不过在开发中&#xff0c;通常情况下&#xff0c;数据是从数据库中获取&#xff0c;拿到的数据映射到java对象…

嵌入式学习--LinuxDay04

嵌入式学习--LinuxDay04 shell脚本 1.1数组 1.1.1数组的赋值 1.1.2数组的调用 1.2函数 1.2.1函数的定义方式 1.2.2函数的调用 2.分文件编程 2.1源文件 2.2头文件 3.编译工具 3.1 gcc编译工具 3.2 gdb调试 4.make工具 4.1定义 4.2Makefile格式 4.3Makefile管理多个文件 4.4Makef…

Gartner 魔力象限:单一供应商安全访问服务边缘 2024,Palo Alto Networks 再次荣膺领导者

Gartner Magic Quadrant for Single-Vendor SASE 2024 Gartner 魔力象限&#xff1a;单一供应商安全访问服务边缘 2024&#xff0c;Palo Alto Networks 再次荣膺领导者 请访问原文链接&#xff1a;https://sysin.org/blog/gartner-magic-quadrant-single-vendor-sase-2024/&a…

成都睿明智科技有限公司抖音电商服务靠谱吗?

在这个电商风起云涌的时代&#xff0c;抖音作为短视频直播的超级流量池&#xff0c;正深刻改变着人们的购物习惯。无数商家蜂拥而至&#xff0c;渴望在这片蓝海中找到属于自己的岛屿。而提及抖音电商服务&#xff0c;成都睿明智科技有限公司无疑是一个备受瞩目的名字。那么&…

了解Webpack并处理样式文件

目录 引入定义安装和使用配置文件命令配置单独文件指定文件 处理样式css-loader使用 style-loaderless-loaderPostCSSpostcss-loaderpostcss-preset-env 引入 随着前端的快速发展&#xff0c;目前前端的开发已经变的越来越复杂了&#xff1a; 比如开发过程中我们需要通过模块化…

Harbor使用

文章目录 1、上传镜像1.1、在Harbor上创建一个项目1.2、docker添加安全访问权限1.3、推送docker镜像到该项目中1.3.1、登录到Harbor1.3.2、给镜像重新打一个标签1.3.3、推送镜像到Harbor中 2、拉取镜像2.1、先删掉原来的镜像2.2、执行拉取命令 1、上传镜像 需求&#xff1a;将…

OpenHarmony标准系统上实现对rk系列芯片NPU的支持(驱动移植)

1.将RKNPU驱动移植到Openharmony内核 本文以rk3568为例&#xff0c;将RKNPU驱动移植到Openharmony使用的kernel 5.10中 开发环境 DAYU200 rk3568开发板OpenHarmony 4.1 Release 64位系统 文档约定&#xff1a;4.1r_3568为OpenHarmony标准系统源码根目录 1.0 环境准备 1.搭建O…

RedisBoost Web缓存加速平台

1.产品介绍 产品名称:RedisBoost Web缓存加速平台 主要功能: 智能缓存策略配置 功能描述:RedisBoost提供了一套直观易用的缓存策略配置界面,允许用户根据业务场景自定义缓存策略,包括缓存时间(TTL)、缓存淘汰算法(如LRU、LFU)、数据分区与分片策略等。支持动态调整策…

Cisco ASA 9.22.1 发布下载,新增功能概览

Cisco ASA 9.22.1 - 思科自适应安全设备 (ASA) 软件 Cisco Adaptive Security Appliance (ASA) 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-asa/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 新增功能 重要…