c# 如果控制智能停车系统出入口道闸模块开关

        不通厂家的模块协议可能不一样,普遍通用,本次分享的是【康耐德】的模块;如果用到其他模块的朋友通过下面的介绍无法控制,那就要自己另寻他法了。

 

协议:ModbusTCP

 

一如既往,首先来张demo截图: 

       a、按钮上的1,2分别代表两个道闸;

       b、接触过开关控制器的都知道,2路组成一个开关,如指令 1,0代表开;0,1代表关,同时发1,0,1,0代表两头都开,反之则都关

开始了,上代码。。。

直接上完整代码,需要可运行exe完整源码或程序的联系我无偿提供:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ModbusTCP;
using System.Collections;
using System.Threading;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private ModbusTCP.Master MBmaster;
        string StartAddress = "200"; //读取开始地址

        string DOStartAddress = "100"; //写入接口开始地址
        private bool RecvieMode_502 = false;
        string dataSize = "16";//长度
        byte uiSlaveID = 255;// 
        private int Recvie_Count = 0;
        string redIP = "172.16.1.237"; //红外控制器IP


        public Form1()
        {
            InitializeComponent();
        }

        private void btnConnect_Click(object sender, EventArgs e)
        {
            redIP = txtIP.Text;
            if (RecvieMode_502)
            {
                return;
            }


            try
            {
                // Create new modbus master and add event functions
                MBmaster = new Master(redIP, 502);
                MBmaster.OnResponseData += new ModbusTCP.Master.ResponseData(MBmaster_OnResponseData);
                MBmaster.OnException += new ModbusTCP.Master.ExceptionData(MBmaster_OnException);
                RecvieMode_502 = true;
                MBmaster.autoConnectOfBreak = false;
                MessageBox.Show("连接成功!!");
            }
            catch (SystemException error)
            {
                MessageBox.Show(error.Message);
            }
        }


        // ------------------------------------------------------------------------
        // Event for response data
        // ------------------------------------------------------------------------
        private void MBmaster_OnResponseData(ushort ID, byte function, byte[] values)
        {
            // ------------------------------------------------------------------
            // Seperate calling threads
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new ModbusTCP.Master.ResponseData(MBmaster_OnResponseData), new object[] { ID, function, values });
                return;
            }

            // Ignore watchdog response data
            if (ID == 0xFF) return;

            // ------------------------------------------------------------------------
            // Identify requested data
            ushort Func = ID;

            ++Recvie_Count;
            if (Recvie_Count > 100000000)
            {
                Recvie_Count = 1;
            }
            bool[] bits = new bool[1];
            if (Func > 0)
            {
                // Convert data to selected data type
                richTextBox1.Clear();

                if (null != values)
                {
                    int i = 1;
                    int dzNo = (i - 1) * 4;
                    BitArray bitArray = new BitArray(values);
                    bool[] bs = new bool[bitArray.Count];
                    bitArray.CopyTo(bs, 0);
                    if (bs.Count(a => a == false) == 15)
                    {
                        return;
                    }

                    bool[] bitsArr = new bool[bitArray.Count];
                    for (int k = 0; k < bitArray.Count - dzNo; k++)
                    {
                        bitsArr[k] = bs[k + dzNo];
                        richTextBox1.AppendText(Convert.ToInt32(bitsArr[k]).ToString());
                    }

                    bits = bitsArr;
                }
                //接收成功
                if (richTextBox1.Visible && !richTextBox1.IsDisposed)
                {
                    richTextBox1.AppendText(string.Format("\r\n红外接收结果:{0} {1} {2} {3}\r\n", bits[0], bits[1], bits[2], bits[3]));
                }

                #region
                //if (null != values)
                //{
                //    BitArray bitArray = new BitArray(values);
                //    bits = new bool[bitArray.Count];
                //    bitArray.CopyTo(bits, 0);
                //    for (int i = 0; i < bits.Length; i++)
                //    {
                //        richTextBox1.AppendText(Convert.ToInt32(bits[i]).ToString());
                //    }
                //}
                #endregion
                //接收成功
                // MessageBox.Show(bits.Length.ToString());
            }



        }



        #region 通讯常提示事件
        // ------------------------------------------------------------------------
        // Modbus TCP slave exception
        // ------------------------------------------------------------------------
        private void MBmaster_OnException(ushort id, byte function, byte exception)
        {
            // ------------------------------------------------------------------
            // Seperate calling threads
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new ModbusTCP.Master.ExceptionData(MBmaster_OnException), new object[] { id, function, exception });
                return;
            }

            string exc = "Modbus says error: ";
            switch (exception)
            {
                case Master.excIllegalFunction: exc += "Illegal function!"; break;
                case Master.excIllegalDataAdr: exc += "Illegal data adress!"; break;
                case Master.excIllegalDataVal: exc += "Illegal data value!"; break;
                case Master.excSlaveDeviceFailure: exc += "Slave device failure!"; break;
                case Master.excAck: exc += "Acknoledge!"; break;
                case Master.excSlaveIsBusy: exc += "Slave is busy!"; break;
                case Master.excGatePathUnavailable: exc += "Gateway path unavailbale!"; break;
                case Master.excExceptionTimeout: exc += "Slave timed out!"; break;


            }

            // LogHelper.WriteLog(this.GetType(), exc);
        }

        #endregion


        #region 读取点
        private void btnReadDisInp_Click(object sender, EventArgs e)
        {

            ushort ID = 2;
            ushort StartAddress = ReadStartAdr();
            ushort Length = Convert.ToUInt16(dataSize);

            MBmaster.ReadDiscreteInputs(ID, StartAddress, Length, uiSlaveID);
        }


        private ushort ReadStartAdr()
        {
            // Convert hex numbers into decimal
            if (StartAddress.IndexOf("0x", 0, StartAddress.Length) == 0)
            {
                string str = StartAddress.Replace("0x", "");
                ushort hex = Convert.ToUInt16(str, 16);
                return hex;
            }
            else
            {
                return Convert.ToUInt16(StartAddress);
            }
        }
        #endregion

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            //ushort ID = 6;
            //ushort StartAddress = ReadStartAdr();

            //data = GetData(Convert.ToByte(txtSize.Text));
            //MBmaster.WriteMultipleCoils(ID, StartAddress, Convert.ToByte(txtSize.Text), data, GetSlaveID());	

            ChangDZ(Convert.ToInt32(textBox1.Text), Convert.ToBoolean(Convert.ToInt32(textBox2.Text)), Convert.ToBoolean(Convert.ToInt32(textBox3.Text)));
        }
        /// <summary>
        /// 开关道闸
        /// </summary>
        /// <param name="dzNo"></param>
        /// <param name="b1"></param>
        /// <param name="b2"></param>
        private void ChangDZ(int dzNo, bool b1, bool b2)
        {

            ushort ID = 6;
            int sized = Convert.ToInt32(dataSize);
            ushort StartAddress = Convert.ToUInt16(DOStartAddress);
            byte[] data = new byte[sized];
            bool[] bits = new bool[sized];
            string s = richTextBox1.Text;
            int st = (dzNo - 1) * 2;
            bits[st] = b1;
            bits[st + 1] = b2;
            int dl = bits.Length / 8 + (bits.Length % 8 == 0 ? 0 : 1);
            data = new byte[dl];
            BitArray ba = new BitArray(bits);
            ba.CopyTo(data, 0);
            if (MBmaster != null)
            {
                MBmaster.WriteMultipleCoils(ID, StartAddress, (ushort)sized, data, uiSlaveID);
            }
        }


        /// <summary>
        /// 开关道闸
        /// </summary>
        /// <param name="b1">道闸1开</param>
        /// <param name="b2">    1关</param>
        /// <param name="b3">2开</param>
        /// <param name="b4">2关</param>
        private void ChangDZ2(bool b1, bool b2, bool b3, bool b4)
        {
            lock (MBmaster)
            {
                int i = Convert.ToInt32(1);
                int dzNo = (i - 1) * 2 + 1;
                ushort ID = 6;
                int sized = Convert.ToInt32(dataSize);
                ushort StartAddress = Convert.ToUInt16(DOStartAddress);
                byte[] data = new byte[sized];
                bool[] bits = new bool[sized];
                string s = richTextBox1.Text;
                int st = (dzNo - 1) * 2;
                bits[st] = b1;
                bits[st + 1] = b2;
                bits[st + 2] = b3;
                bits[st + 3] = b4;
                int dl = bits.Length / 8 + (bits.Length % 8 == 0 ? 0 : 1);
                data = new byte[dl];
                BitArray ba = new BitArray(bits);
                ba.CopyTo(data, 0);
                if (MBmaster != null)
                {
                    MBmaster.WriteMultipleCoils(ID, StartAddress, (ushort)sized, data, uiSlaveID);
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //ChangDZ(1,false, false);

            //ChangDZ(1,Convert.ToBoolean(Convert.ToInt32(textBox4.Text)), Convert.ToBoolean(Convert.ToInt32(textBox5.Text)));

            //ChangDZ(2, false, false);

            //ChangDZ(2, Convert.ToBoolean(Convert.ToInt32(textBox6.Text)), Convert.ToBoolean(Convert.ToInt32(textBox7.Text)));

            ChangDZ2(false, false, false, false);
            Thread.Sleep(3000);
            ChangDZ2(Convert.ToBoolean(Convert.ToInt32(textBox4.Text)), Convert.ToBoolean(Convert.ToInt32(textBox5.Text)), Convert.ToBoolean(Convert.ToInt32(textBox6.Text)), Convert.ToBoolean(Convert.ToInt32(textBox7.Text)));
            //Thread.Sleep(5);
        }

        private void btn_kg_Click(object sender, EventArgs e)
        {
            ChangDZ2(false, false, false, false);
            Thread.Sleep(getMiCeccond());
            ChangDZ2(true, false, false, true);
        }

        /// <summary>
        /// 默认为两秒
        /// </summary>
        /// <returns></returns>
        int getMiCeccond()
        {
            int a = 0;
            int.TryParse(textBox8.Text, out a);
            return a != 0 ? a : 2000;
        }

        private void btn_gk_Click(object sender, EventArgs e)
        {
            ChangDZ2(false, false, false, false);
            Thread.Sleep(getMiCeccond());
            ChangDZ2(false, true, true, false);
        }

        private void btn_kk_Click(object sender, EventArgs e)
        {
            ChangDZ2(false, false, false, false);
            Thread.Sleep(getMiCeccond());
            ChangDZ2(true, false, true, false);
        }

        private void btn_gg_Click(object sender, EventArgs e)
        {
            ChangDZ2(false, false, false, false);
            Thread.Sleep(getMiCeccond());
            ChangDZ2(false, true, false, true);
        }

        private void btn_1k_Click(object sender, EventArgs e)
        {
            ChangDZ2(false, false, false, false);
            Thread.Sleep(getMiCeccond());
            ChangDZ(1, true, false);
        }

        private void btn_1g_Click(object sender, EventArgs e)
        {
            ChangDZ2(false, false, false, false);
            Thread.Sleep(getMiCeccond());
            ChangDZ(1, false, true);
        }

        private void btn_2k_Click(object sender, EventArgs e)
        {
            ChangDZ2(false, false, false, false);
            Thread.Sleep(getMiCeccond());
            ChangDZ(2, true, false);
        }

        private void btn_2g_Click(object sender, EventArgs e)
        {
            ChangDZ2(false, false, false, false);
            Thread.Sleep(getMiCeccond());
            ChangDZ(2, false, true);
        }
    }
}

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_______________向阳、

您的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值