C# Modbus TCP上位机测试

前面说了三菱和西门子PLC的上位机通信,实际在生产应用中,设备会有很多不同的厂家生产的PLC,那么,我们就需要一种通用的语言,进行设备之间的通信,工业上较为广泛使用的语言之一就是Modbus。

Modbus有多种连接方式,如串口(RTU)、以太网(TCP/IP),今天我们讲的是TCP,也就是插网线的方式。

首先,我们安装从机的仿真,上位机软件作为主机。从机仿真可以用Modbus Slave这个软件。

这样从机就设置好了,接下来用C#编写主机(上位机)代码:

cs 复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using thinger.DataConvertLib;

namespace Modbus
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();

            this.StartPosition = FormStartPosition.CenterScreen;
            this.MaximizeBox = false;
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
        }

        private void writeLog(string log)
        {
            string text = txtLog.Text;

            if (text.Length > 10000)
            {
                text = text.Substring(0, 10000) + "\n...";
            }

            txtLog.Text = "【" + DateTime.Now.ToString() + "】" + log + "\n" + text;
        }

        ModbusTcp tcp = new ModbusTcp();
        
        private void button1_Click(object sender, EventArgs e)
        {
            tcp.Connect("192.168.0.108", "502");

            if (tcp != null)
            {
                button1.BackColor = Color.LawnGreen;
            }
            else
            {
                button1.BackColor = Color.Red;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            txtLog.Text = "";

            int address = 0;//起始地址
            int num = 10;//寄存器数量

            byte[] res = tcp.ReadKeepReg(address, num);

            for (int i = 0; i < num; i++)
            {
                writeLog("【" + i.ToString() + "】" + (res[i * 2] * 256 + res[i * 2 + 1]).ToString());//byte数据类型只能包含0~255的数,超出=res[0]*256+res[1]
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            bool success = tcp.PreSetSingleReg(int.Parse(textBox1.Text.Trim()), short.Parse(textBox2.Text.Trim()));

            if (success)
            {
                button2_Click(sender, e);
            }
        }
    }
}

最后附上全部源码:

https://download.csdn.net/download/mojocube/88103605

相关推荐
科技块儿18 分钟前
在线IP归属地查询工具有哪些?
服务器·网络·tcp/ip
谷粒.26 分钟前
自动化测试覆盖率从30%到80%的演进历程:策略、挑战与未来展望
运维·网络·深度学习·架构·自动化·transformer·测试覆盖率
sea_baby1 小时前
虚拟交换机发展历程
网络·虚拟化·交换机
hbugs0012 小时前
【EVE-NG镜像制作系列教程】28、Nexus 9000v交换机
网络·eve-ng·eve-ng镜像·eve-ng镜像制作·eve-ng教程
init_23612 小时前
【hcip-19】mstp
网络
张3蜂2 小时前
ip可以伪造吗
网络·网络协议·tcp/ip
ICT技术最前线2 小时前
防火墙SD-WAN如何选择,才能既安全又高效?
网络·安全·防火墙·sd-wan
谷粒.2 小时前
DevOps流水线中的质量门禁设计:从理论到实践的全景解析
运维·开发语言·网络·人工智能·python·devops
GOTXX2 小时前
性能与可靠双突破:openEuler 服务器场景评测报告
运维·服务器·网络·人工智能·后端·python
打不了嗝 ᥬ᭄2 小时前
【Linux】多路转接 Select , Poll和Epoll
linux·网络·c++·网络协议·http