Modbus RTU与PLC通讯问题

qq_41601650 2018-01-07 11:28:58
c#做了个简单的上位机与PLC通讯,直接与PLC通讯时写线圈、保持型寄存器等功能正常,但是读PLC数据只返回一个255。我用别的上位机软件与PLC通讯正常,这时再用我的程序读数据也正常了,把串口线拔掉再插上就又不行了。
...全文
1772 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zmyouren1983 2018-01-18
  • 打赏
  • 举报
回复
你确认PLC端强制拔串口没有问题? 是不是PLC端数据发不出来了。
巴顿的烦恼 2018-01-18
  • 打赏
  • 举报
回复
你在formload 里执行了串口接收事件的重构和串口打开的操作
xian_wwq 2018-01-09
  • 打赏
  • 举报
回复
DataReceived 事件在接收到了ReceivedBytesThreshold设置的字符个数或接收到了文件结束字符 并将其放入了输入缓冲区时被触发。 sp.ReceivedBytesThreshold = 1; //设置 DataReceived 事件发生前内部输入缓冲区中的字节数 每次只收到一个字节是因为设定如此
无情时尚 2018-01-08
  • 打赏
  • 举报
回复
革命尚未成功,同志任需努力!
qq_41601650 2018-01-07
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; 
        }
        SerialPort sp = new SerialPort();
        delegate void UpdateTextEventHandler(byte[] text);
        private void Form1_Load(object sender, EventArgs e)
        {
            sp.PortName = "COM9";
            sp.BaudRate = 9600;
            sp.Parity = Parity.Even;
            sp.DataBits = 8;
            sp.StopBits = StopBits.One;
            sp.ReadTimeout = 200;
            sp.WriteTimeout = 200;
            sp.ReceivedBytesThreshold = 1;
            sp.DataReceived += new SerialDataReceivedEventHandler(SPort_DataReceived);       
            sp.Open();


        }
        void SPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte[] ReDatas = new byte[sp.BytesToRead]; 
            sp.Read(ReDatas, 0, ReDatas.Length);
            UpdateTextEventHandler Text = new UpdateTextEventHandler(UpdateTextBox);
            Text(ReDatas);
        }
        private void UpdateTextBox(byte[] text)  //显示接收数据
        {
            
            for (int i = 0; i < text.Length; i++)
            {
                textBox1.Text += text[i];
                textBox1.Text += ',';
                if (i == text.Length - 1)
                {
                    textBox1.Text += System.Environment.NewLine;  //换行
                }
            }

        }

        private void button1_Click(object sender, EventArgs e)
        {
            byte[] message = new byte[8];
            message[0] = (byte)0x01;
            message[1] = (byte)0x03;  
            message[2] = (byte)0x00;  
            message[3] = (byte)0x00; 
            message[4] = (byte)0x00;  
            message[5] = (byte)0x01;     
            message[6] = (byte)0x84;
            message[7] = (byte)0x0A;
            sp.Write(message, 0, message.Length);
        }


    }
}

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧