西门子系列PLC与C#winform通信类

public static class S
    {
        //PLC通信[连接PLC]
        public static Plc plc = null;
        public static Boolean Open()
        {
            //PLC类型 IP地址 机架号 槽号
            plc = new Plc(AC.CpuType, AC.Ip, 0, 1);

            try
            {
                plc.OpenAsync().Wait(100);
            }
            catch (Exception ex)
            {

                MessageBox.Show("PLC无法连接"+ex.ToString());
            }

            if (plc.IsConnected == false)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        //发送数据给PLC
        public static void T(string type, string address, string data)
        {
            address = address.Trim();
            data = data.Trim();
            type = type.Trim();

            if (string.IsNullOrEmpty(address))
            {
                MessageBox.Show("地址不能为空");
            }
            if (string.IsNullOrEmpty(type))
            {
                MessageBox.Show("类型不能为空");
            }
            if (string.IsNullOrEmpty(data))
            {
                //MessageBox.Show("数据不能为空");
                data = "0";
            }

            try
            {
                if (string.Compare(type, "real") == 0)
                {
                    plc.Write(address, Convert.ToSingle(data));
                }
                else if (string.Compare(type, "int") == 0)
                {
                    plc.Write(address, Convert.ToInt16(data));
                }
                else if (string.Compare(type, "bool") == 0)
                {
                    //true: 1 false: 0
                    if (Convert.ToBoolean(data))
                    {
                        plc.Write(address, Convert.ToInt16(1));
                    }
                    else
                    {
                        plc.Write(address, Convert.ToInt16(0));
                    }
                }
                else if (string.Compare(type, "zbool") == 0)
                {
                    //Boolean
                    plc.Write(address, Convert.ToBoolean(data));
                }
                else if (string.Compare(type, "word") == 0)
                {
                    //TODO:暂不支持
                    MessageBox.Show("暂不支持");
                }
                else if (string.Compare(type, "dword") == 0)
                {
                    //TODO:暂不支持
                    MessageBox.Show("暂不支持");
                }
                else if (string.Compare(type, "dint") == 0)
                {
                    plc.Write(address, Convert.ToInt32(data));
                }
                else if (string.Compare(type, "byte") == 0)
                {
                    plc.Write(address, Convert.ToByte(data));
                }
                else
                {
                    MessageBox.Show("按着流程来!");
                }
            }
            catch (Exception)
            {

                //MessageBox.Show("数据不能为空!");
            }
        }

        //接收来自PLC的数据
        public static string R(string type, string address)
        {
            // 读取PLC数据,并转为string类型,得以输出。
            string result = null;
            address = address.Trim();

            if (string.IsNullOrEmpty(address))
            {
                return "地址为空";
            }
            if (string.IsNullOrEmpty(type))
            {
                return "类型为空";
            }

            if (AC.isPlcConnected)
            {
                if (string.Compare(type, "int") == 0)
                {
                    result = ((ushort)plc.Read(address)).ToString();
                }
                else if (string.Compare(type, "real") == 0)
                {
                    // 保留一个小数位
                    result = ((uint)plc.Read(address)).ConvertToFloat().ToString("0.0");
                }
                else if (string.Compare(type, "float") == 0)
                {
                    // 保留一个小数位
                    result = ((uint)plc.Read(address)).ConvertToFloat().ToString("0.00");
                }
                else if (string.Compare(type, "bool") == 0)
                {
                    if (Convert.ToBoolean(plc.Read(address)))
                    {
                        return "true";
                    }
                    else
                    {
                        return "false";
                    }
                }
                else if (string.Compare(type, "zbool") == 0)
                {
                    result = Convert.ToBoolean(plc.Read(address)).ToString();

                }
                else if (string.Compare(type, "word") == 0)
                {
                    result = ((ushort)plc.Read(address)).ToString();
                }
                else if (string.Compare(type, "dword") == 0)
                {
                    result = ((uint)plc.Read(address)).ToString();
                }
                else if (string.Compare(type, "dint") == 0)
                {
                    result = ((uint)plc.Read(address)).ToString();
                }
                else if (string.Compare(type, "byte") == 0)
                {
                    //TODO:暂无写法
                }
                else
                {
                    //未找到数据类型
                    result = "-1";
                }
            }
            else
            {
                //plc未连接
                result = "-2";
            }
            return result;
        }

        public static void Close()
        {
            plc.Close(); 
        }
    }

欢迎讨论,最近一版的西门子PLC通信类,包含PLC连接、发送数据、接收数据、关闭PLC连接四个函数,支出大多数类型,不定期更新,有需要评论。支持的PLC有s7-200、s7-300、s7-1200、s7-1500

你可能感兴趣的:(c#,java,前端,开发语言,数据库)