一页纸鸢 2024-04-08 14:21 采纳率: 14.3%
浏览 0
已结题

winform 如何监听三菱fx plc的x1 - x7的状态(相关搜索:定时器|初始化)

winform 如何监听三菱fx plc的x1 - x7的状态

img

img

img

img

img


上面的代码是,使用定时器的,我想在初始化的时候,连接发送指令,当X1 - X7状态改变时,就能获取到它们的值

  • 写回答

3条回答 默认 最新

  • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-08 14:21
    关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    问题:winform如何监听三菱FX PLC的X1 - X7的状态?

    解决方案:

    1. 连接三菱PLC
    • 在窗体初始化时连接三菱PLC,定义串口通信的参数;
    • 打开串口。
    1. 发送指令定时获取X1-X7的值
    • 定义一个定时器,定时器间隔按需设置,每隔一定时间发送一条获取X1-X7值的指令;
    • 给定时器添加事件处理程序,即每隔一段时间执行一次读取指令。
    1. 接收返回参数并解析
    • 在串口数据接收事件中将接收到的数据转换成十六进制字符串,并将十六进制字符串转换成字节数组;
    • 将字节数组转换成ASCII码,再将ASCII码转换成二进制字符串;
    • 根据二进制字符串中X1-X7的值判断状态是否有变化。

    修改后的代码:

    //窗体初始化
    private void Form1_Load(object sender, EventArgs e)
    {
        //连接三菱PLC
        string portName1 = "COM1";
        int baudRatel = 38400;
        SerialPort _serialPort = new SerialPort(portName1, baudRatel, Parity.None, 8, StopBits.One);
        _serialPort.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived_1);
        _serialPort.Open();
    
        //定时器
        Timer timer1 = new System.Windows.Forms.Timer();
        timer1.Interval = 2000; //设置定时器间隔为1秒
        timer1.Tick += new EventHandler(timer1_Tick); //添加定时器事件处理程序
        timer1.Enabled = true; //启用定时器
    }
    
    //定时器事件处理程序
    private void timer1_Tick(object sender, EventArgs e)
    {
        //每一秒发送一次指令,获取到X1-X7的值
        byte[] readBuffer = { 0x02, 0x30, 0x30, 0x30, 0x38, 0x30, 0x30, 0x31, 0x03, 0x35, 0x43 }; //读取X1-X7的值
        _serialPort.Write(readBuffer, 0, readBuffer.Length);
    }
    
    //接收返回参数
    private void SerialPort_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
    {
        try
        {
            this.BeginInvoke((MethodInvoker)delegate
            {
                byte[] buffer = new byte[_serialPort.BytesToRead];
                _serialPort.Read(buffer, 0, buffer.Length);
    
                //将接收到的数据转换为十六进制字符串
                string receivedDataHex = BitConverter.ToString(buffer).Replace("-", "");
                //将十六进制字符串转换为字节数组
                string[] hexValues = receivedDataHex.Split(' ');
                List<byte> byteValues = new List<byte>();
    
                bool shouldConvert = false; //标记是否需要转换当前十六进制数为二进制数
                foreach (string hex in hexValues)
                {
                    if (hex == "82")
                    {
                        shouldConvert = true;
                    }
                    else if (hex == "03")
                    {
                        shouldConvert = false;
                    }
                    else if (shouldConvert && hex != "30" && hex != "B1" && hex != "B2")
                    {
                        byteValues.Add(Convert.ToByte(hex, 16));
                    }
                }
    
                //将字节数组转换为ASCII码
                string asciiString = Encoding.ASCII.GetString(byteValues.ToArray());
                //将ASCII码转换为二进制字符串
                StringBuilder binaryData = new StringBuilder();
                foreach (char c in asciiString)
                {
                    string binaryValue = Convert.ToString(Convert.ToInt32(c.ToString(), 16), 2).PadLeft(4, '0');
                    binaryData.Append(binaryValue);
                }
                string binaryString = binaryData.ToString();
    
                //根据二进制字符串中X1-X7的值判断状态是否有变化
                if (binaryString.Length > 4)
                {
                    int x2 = binaryString[1] - '0';
                    int x3 = binaryString[0] - '0';
    
                    if (x2 == 1)
                    {
                        Console.WriteLine("检测产品到X02");
                    }
                    else if (x3 == 1)
                    {
                        Console.WriteLine("检测产品到X03");
                    }
                }
            });
        }
        catch (Exception ex)
        {
            MessageBox.Show("接收返回异常:" + ex.Message);
        }
    }
    
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月22日
  • 创建了问题 4月8日

悬赏问题

  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测