楼主: kaixin202212
126 0

[作业] C#+PLC通讯框架串口网口开发课程 [推广有奖]

  • 0关注
  • 1粉丝

讲师

17%

还不是VIP/贵宾

-

威望
0
论坛币
380 个
通用积分
29.2918
学术水平
0 点
热心指数
3 点
信用等级
0 点
经验
5182 点
帖子
180
精华
0
在线时间
281 小时
注册时间
2022-11-10
最后登录
2024-4-30

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
pan------baidu----com/s/1ms_r89M65YtYhriCWej9Dg 提取码:ewex


大家好,很高兴今天又可以给大家做分享,我将在本文给大家讲解C#的串口编程、网络编程、PLC通讯开发和架构设计,彻底搞定下位机通讯编程。

本文通过C#、欧姆龙PLC、HostLink通讯协议 TCP通讯 ● 串口通讯等要素,并通过C#相关技术如数据类型  抽象 继承 事件event 函数  修饰符(public private internal)泛型 Action委托 IPAddress  多态函数  socket编程(tcpclient)SerialPort串口多线程 -> 子线程 异步,开发一套具有通用性、扩展性的PLC通讯框架。

一、首先,我们先来认识C#,那么什么是C#呢?
C#是微软公司发布的一种由C和C++衍生出来的面向对象的编程语言、运行于.NET Framework和.NET Core(完全开源,跨平台)之上的高级程序设计语言。并定于在微软职业开发者论坛(PDC)上登台亮相。C#是微软公司研究员Anders Hejlsberg的最新成果。C#看起来与Java有着惊人的相似;它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司 .NET windows网络框架的主角。

二、C#用来做什么的?
1、可以用做快速开发,如开发一些小工具或者一些小项目;
2、适合做“asp.net”网页开发;
3、适合结合unity3d做游戏的脚本开发;
4、可以做移动应用开发等等。

三、PLC的几种常见的连接口和通讯协议
1、RS232接口:
计算机通讯接口之一,通常RS-232接口以9个引脚(DB-9)或是25个引脚(DB-25)的型态出现,般个人计算机上会有两组RS-232接口,分别称为 COM1和COM2。
2、RS485
RS485无具体的物理形状,根据工程的实际情况而采用的接口。
3、RS232:传输电平信号接口的信号电平值较高(信号“1”为“-3V至-15V”,信号“0”为“3至15V”),易损坏接口电路的芯片,又因为与TTL电平(0~“<0.8v”,1~“>2.0V”)不兼容故需使用电平转换电路方能与TTL电路连接。另外抗干扰能力差。
4、RS485:传输差分信号逻辑“1”以两线间的电压差为+(2—6) V表示;逻辑“0”以两线间的电压差为-(2—6)V表示。接口信号电平比RS-232降低了,就不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL电路连接。

四、代码实战
maven仓库
       <dependency>
            <groupId>org.apache.plc4x</groupId>
            <artifactId>plc4j-core</artifactId>
            <version>0.2.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.plc4x</groupId>
            <artifactId>plc4j-driver-s7</artifactId>
            <version>0.4.0</version>
            <scope>runtime</scope>
        </dependency>

生成报文代码大致如下
public class RTUTools {
        /**
         * 返回modbusRTU的请求报文
         *
         * @param addr  从机地址
         * @param start_addr  起始地址
         * @param data_length  数据长度
         * @return
         */
        public static byte[] getRTUMessage(int addr, int start_addr, int data_length) {
                // 建立如下报文格式:01 04 00 04 00 01 70 0B

                byte buf[] = new byte[8];
                //起始地址
                buf[0] = (byte) (addr & 0xFF);
                //功能码03
                buf[1] = (byte) 3;
                //起始地址
                buf[2] = (byte) (start_addr >> 8);
                buf[3] = (byte) (start_addr & 0xFF);
                //数据长度
                buf[4] = (byte) (data_length >> 8);
                buf[5] = (byte) (data_length & 0xFF);
                //校验
               
                // 这里返回的就是一个报文的数组
                return CRC16M.getSendBuf(buf);
        }
}

plc4x没测试成功。老是报错,好像是Netty底层的buff转byte有坑还是怎么回事,反正没测试成功。我使用HslCommunication倒是测试成功了,提供的方法挺全面的比如读取一个VW点位的值就是这样
public static void main(String[] args) {
        //方法只用选择PLC型号和传入PLC的IP地址即可
        SiemensS7Net siemensS7Net = new SiemensS7Net(SiemensPLCS.S200Smart,"192.168.1.1");
        //读取一个vw点位,是一个16位Int
         OperateResultExOne<Short> read = siemensS7Net.ReadInt16("V1128");
         //可以根据IsSuccess属性判断是否读取成功
          if(read.IsSuccess){
          //Content属性则是返回的内容
           short value=   read.Content;
             System.out.println("Value:"+value);
          }
  }


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:开发课程 PLC Framework Internal Siemens

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加JingGuanBbs
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-6 06:58