基恩士上位机链路通讯_基恩士PLC通讯源码

基恩士PLC KV7000,8000还是比较好用的,那如何和上位机通讯,我把源码写出来了。采用上位链路通讯,基恩士官方给我们留了8501端口,这个端口有意思刚好是我生日。基恩士的资料我觉得做的特别好,能快速写源代码得益于官方资料特别详细,对了,他的通讯采用是ASCII码直接通讯。比如你读到的ASCII码是666,那他的实际值也就是666。好了上代码,如果热度比较高,大家有不清楚的地方,我出视频讲解。

be0fbfd2824b95b01ce68bbf53bb8e89.png
fd4da38be5bf58bd78b71c83fc3d7fbc.png
b25bdd69b452a292463cd2796a70dffb.png
674c65ae260fa620c66c83bae9d41a8d.png
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Net.Sockets;using System.Threading;using System.Net;namespace WDBaseCommuntionHelper{    public class KV7_8000Service    {        Socket KVTCPClicent;        readonly object LockKVTCP = new object();        public enum DataType        {            ///             /// 16位无符号            ///             U,            ///             /// 16位有符号            ///             S,            ///             /// 32位无符号            ///             D,            ///             /// 32位有符号            ///             L,            ///             /// 16位16进制数            ///             H,            ///             /// 默认            ///             N        }        #region 命令        ///         /// 更改模式        ///         const string Command1 = "M";        ///         /// 清除错误        ///         const string Command2 = "ER";        ///         /// 检查错误编号        ///         const string Command3 = "?E";        ///         /// 查询机型        ///         const string Command4 = "?K";        ///         /// 检查运行模式        ///         const string Command5 = "?M";        ///         /// 时间设定        ///         const string Command6 = "WRT";        ///         /// 强制置位        ///         const string Command7 = "ST";        ///         /// 强制复位        ///         const string Command8 = "RS";        ///         /// 连续强制置位        ///         const string Command9 = "STS";        ///         /// 连续强制复位        ///         const string Command10 = "RSS";        ///         /// 读取数据        ///         const string Command11 = "RD";        ///         /// 读取连续数据        ///         const string Command12 = "RDS";        ///         /// 读取连续数据        ///         const string Command13 = "RDE";        ///         /// 写入数据        ///         const string Command14 = "WR";        ///         /// 写入连续数据        ///         const string Command15 = "WRS";        ///         /// 写入连续数据        ///         const string Command16 = "WRE";        ///         /// 写入设定值        ///         const string Command17 = "WS";        ///         /// 写入连续设定值        ///         const string Command18 = "WSS";        ///         /// 监控器登录        ///         const string Command19 = "MBS";        ///         /// 监控器登录        ///         const string Command20 = "MWS";        ///         /// 读取监控器        ///         const string Command21 = "MBR";        ///         /// 读取监控器        ///         const string Command22 = "MWR";        ///         /// 注释读取        ///         const string Command23 = "RDC";        ///         /// 存储体切换        ///         const string Command24 = "BE";        ///         /// 读取扩展单元缓冲存储器        ///         const string Command25 = "URD";        ///         /// 写入扩展单元缓冲存储器        ///         const string Command26 = "UWR";        ///         /// 回车        ///         const string CR = "";        ///         /// 空格        ///         const string SP = " ";        #endregion        Encoding encoding = Encoding.ASCII;        ///         /// PLC连接状态        ///         public bool IsConnected { get; private set; }        ///         /// 发送超时时间        ///         public int SendTimeout { get; set; } = 2000;        ///         /// 接收超时时间        ///         public int ReceiveTimeout { get; set; } = 2000;        ///         /// 等待PLC响应周期,这里一个周期10ms        ///         public int MaxDelayCycle { get; set; } = 5;        string ip;        int port;        private Dictionary plcValue = new Dictionary();        ///         /// PLC值键值对        ///         public Dictionary PlcValue { get { return plcValue; } }        ///         /// 重连        ///         ///         public bool ReConnext()        {            if (ip == string.Empty || port == 0)            {                throw new Exception("没有IP和端口请调用Connect函数连接"); return false;            }           return  Connect(ip,port);        }        ///         /// 连接PLC        ///         ///         ///         ///         public bool Connect(string ip, int port=8501)        {            if (this.ip != ip) this.ip = ip;            if (this.port != port) this.port = port;            KVTCPClicent = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            KVTCPClicent.SendTimeout = SendTimeout;            KVTCPClicent.ReceiveTimeout = ReceiveTimeout;            IAsyncResult asyncResult=  KVTCPClicent.BeginConnect(new IPEndPoint(IPAddress.Parse(ip) ,port),null,null);            asyncResult.AsyncWaitHandle.WaitOne(3000,true);            if (!asyncResult.IsCompleted)            {                KVTCPClicent.Close();                return false;            }            return true;        }        ///         /// 改变PLC运行状态        ///         /// true让PLC运行false让PLC停止        ///         public string ChangeCPU(bool run = true)        {            string str = Command1 + (run ? "1" : "0") + CR;            return SendRecive(str);        }        ///         /// 查看PLC运行状态        ///         ///         public string SeeCPUState()        {            string str = Command5 + CR;            return SendRecive(str);        }        ///         /// 强制置位复位        ///         ///         ///         ///         public string Put(string address, bool value)        {            string str;            if (value)            {                str = Command7 + SP + address + CR;            }            else            {                str = Command8 + SP + address + CR;            }            return SendRecive(str);        }        ///         /// 连续强制置位复位        ///         ///         ///         ///         ///         public string Put(string address, bool Value, int count)        {            string str;            if (Value)            {                str = Command9 + SP + address + count + CR;            }            else            {                str = Command10 + SP + address + count + CR;            }            return SendRecive(str);        }        ///         /// 写入字数据        ///         ///         ///         ///         ///         public string Put(string address, string value, DataType tpye = DataType.N)        {            string str = Command14 + SP + address + GetDataType(tpye) + SP + value + CR;            return SendRecive(str);        }        ///         /// 写入单精度浮点数        ///         ///         ///         ///         public string Put(string address, float value)        {            List result = CalFloatToInt16(value);            return Put(address, result);        }        ///         /// 写入连续字数据        ///         ///         ///         ///         ///         public string Put(string address, List value, DataType tpye = DataType.N)        {            StringBuilder sb = new StringBuilder(Command15 + SP + address + GetDataType(tpye) + SP + value.Count);            for (int i = 0; i < value.Count; i++)            {                sb.Append(SP + value[i]);            }            sb.Append(CR);            return SendRecive(sb.ToString());        }        ///         /// 读取字数据        ///         ///         ///         ///         public string Get(string address, DataType tpye = DataType.N)        {            string str = Command11 + SP + address + GetDataType(tpye) + CR;            return SendRecive(str);        }        ///         /// 读取连续字数据        ///         ///         ///         ///         ///         public string Get(string address, int count, DataType tpye = DataType.N)        {            string str = Command13 + SP + address + GetDataType(tpye) + SP + count + CR;            return SendRecive(str);        }        public string CalRD(string str, string type, int address, int count)        {            string[] s1 = str.Split(' ');            if (count > s1.Length)            {                throw new Exception("映射长度过长");            }            for (int i = 0; i < count; i++)            {                plcValue[type + (address + i)] = s1[i].ToString();            }            return "OK";        }        ///         /// 32位浮点转16位字        ///         ///         ///         public List CalFloatToInt16(float value)        {            byte[] r1 = BitConverter.GetBytes(value);            byte[] r2 = new byte[2] { r1[0], r1[1] };            byte[] r3 = new byte[2] { r1[2], r1[3] };            int r4 = BitConverter.ToUInt16(r2, 0);            int r5 = BitConverter.ToUInt16(r3, 0);            return new List() { r4.ToString(), r5.ToString() };        }        ///         /// 2个16位字转32位浮点        ///         ///         ///         ///         public float CalInt16ToFlaot(string[] value, int startIndex)        {            byte[] r1 = BitConverter.GetBytes(Convert.ToInt16(value[startIndex]));            byte[] r2 = BitConverter.GetBytes(Convert.ToInt16(value[startIndex + 1]));            byte[] r3 = new byte[4] { r1[0], r1[1], r2[0], r2[1] };            return BitConverter.ToSingle(r3, 0);        }        ///         /// ASCII编码解码        ///         ///         ///         public string SendRecive(string str)        {            return encoding.GetString(SendRecive(encoding.GetBytes(str)));        }        ///         /// 发送接收字节数组报文        ///         ///         ///         public byte[] SendRecive(byte[] arry)        {            try            {                Monitor.Enter(LockKVTCP);                int delay = 0;                int reslut = KVTCPClicent.Send(arry);                while (KVTCPClicent.Available == 0)                {                    Thread.Sleep(10);                    delay++;                    if (delay > MaxDelayCycle)                    {                        break;                    }                }                byte[] ResByte = new byte[KVTCPClicent.Available];                reslut = KVTCPClicent.Receive(ResByte);                return ResByte;            }            catch (Exception)            {                IsConnected = false;                return null;            }            finally            {                Monitor.Exit(LockKVTCP);            }        }        ///         /// 根据数据类型生成报文        ///         ///         ///         public string GetDataType(DataType dataType)        {            string str = string.Empty;            switch (dataType)            {                case DataType.U:                    str = ".U";                    break;                case DataType.S:                    str = ".S";                    break;                case DataType.D:                    str = ".D";                    break;                case DataType.L:                    str = ".L";                    break;                case DataType.H:                    str = ".H";                    break;                case DataType.N:                    str = "";                    break;                default:                    str = "";                    break;            }            return str;        }    }}

#上位机# #PLC# #触摸屏# #电工交流圈#

如果对您有帮助,点赞关注转发,持续更新,帮大家解答工控问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fastq质量值_fastq 数据格式解析

概念介绍Read 读段Read 中文翻译&#xff1a; 读段&#xff0c;来自测序仪的raw data一个Read 可能由多个片段组成&#xff0c; Read的索引是测序时的顺序Sequencing quality 测序质量测序仪在测序的时候&#xff0c;每次测出来的结果可能都不一样(仪器误差 序列长度等各方面因…

画像分析(3-3)标签建模-模型管理-新建关系

1、关系是什么 关系&#xff0c;是实体与实体之间所发生的连接&#xff0c;通常表示某一种行为/一个事实&#xff0c;如成交、搜索、出行。从数据表的角度来看&#xff0c;这样的表通常被称为”事实表“&#xff0c;往往是有多个联合主键&#xff08;或是说都是外键&#xff09…

二进制、八进制、十进制、十六进制之间的转换

在计算机语言中常用的进制有二进制、八进制、十进制和十六进制&#xff0c;十进制是最主要的表达形式。 对于进制&#xff0c;有两个基本的概念&#xff1a;基数和运算规则。 基数&#xff1a;基数是指一种进制中组成的基本数字&#xff0c;也就是不能再进行拆分的数字。二进…

【BZOJ 2753】 2753: [SCOI2012]滑雪与时间胶囊 (分层最小树形图,MST)

2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 2457 Solved: 859Description a180285非常喜欢滑雪。他来到一座雪山&#xff0c;这里分布着M条供滑行的轨道和N个轨道之间的交点&#xff08;同时也是景点&#xff09;&#xff0c;而且每个景…

SortedMap接口实现排序

SortedMap接口主要提供有序的Map实现。SortedMap接口是排序接口&#xff0c;只要是实现了此接口的子类&#xff0c;都属于排序的子类&#xff0c;TreeMap也是此接口的一个子类 Map的主要实现有HashMap,TreeMap,HashTable,LinkedHashMap。 TreeMap实现了SortedMap接口&#xf…

mysql漏洞包_MySQL npm包中的本地文件泄露漏洞

“A pure node.js javascript Client implementing the MySQL protocol.”漏洞在某次安全评估中&#xff0c;Synacktiv专家无意中发现某个应用可以从另一台MySQL服务器中读取敏感数据&#xff0c;而该应用程序正是使用了mysql的npm软件包。该npm软件包所支持的LOAD DATA LOCAL命…

java实现MD5加密

MD5加密是一种常见的加密方式&#xff0c;我们经常用在保存用户密码和关键信息上。那么它到底有什么&#xff0c;又什么好处呢&#xff0c;会被这么广泛的运用在应用开发中。 信息-摘要算法&#xff08;Message-digest Algorithm 5&#xff0c;MD5&#xff09;于90年代初由MIT …

jspwiki mysql_Wiki.js初体验

利用JSPWiki搭建简易企业wiki平台。今天介绍一下基于NodeJS技术的开源项目Wiki.js&#xff0c;其界面简洁美观&#xff0c;支持多种编辑器、多种用户验证方式、多种备份存储方式&#xff0c;支持国际化、自定义主题(Theme)、流量分析等。更多正在开发中的功能&#xff0c;界面也…

java中Map有哪些实现类

Java中的map是一个很重要的集合&#xff0c;他是一个接口&#xff0c;下面继承它实现了多个实现类&#xff0c;这些类各有千秋&#xff0c;各自有个各自的优点和缺点 如下图 map的主要特点是键值对的形式&#xff0c;一一对应&#xff0c;且一个key只对应1个value。其常用的map…

设备的分配与调度简单方案_连铸生产调度与动态重调度的优化与研究-3,炼钢技术(3)原创...

基于生产扰动分类的二阶段遗传算法求解动态重调度问题4.1引言电炉炼钢-连铸生产对整个生产的节奏要求较高&#xff0c;各个工序各个工位间配合要比较紧密&#xff0c;但实际的生产过程中总会存在许多不可避免的扰动因素&#xff0c;必须根据实时现场的监控数据来进行动态调度以…

敏捷开发总结(1)软件研发过程

敏捷开发总结&#xff08;1&#xff09;软件研发过程 转载于:https://www.cnblogs.com/lexiaofei/p/6644326.html

java for循环 嵌套for循环-标签使用

continue和break可以改变循环的执行流程&#xff0c;但在多重循环中&#xff0c;这两条语句无法直接从内层循环跳转到外层循环。在C语言中&#xff0c;可以通过goto语句实现多重循环的跳转&#xff0c;但在非循环结构中使用goto语句会使程序的结构紊乱&#xff0c;可读性变差。…

WPF 窗体边框处理

一般做wpf窗口时都不会使用默认的标题栏等&#xff0c;会把他隐藏掉 此时设置以下属性 WindowStyle、AllowsTransparency、ResizeMode 中的两个或三个都能达到目的。 有一种场景&#xff0c;针对.Net 4.0及以下版本&#xff0c;4.5 直接就支持操作 1. 隐藏边框 2.保留鼠标移动到…

mysql 查询时间转换_数据库查询时日期的转换

首先简单说明一下&#xff0c;laravel框架中查询并打印sql语句的办法&#xff0c;不管任何时候由于sql语句报错时&#xff0c;都可以先打印一下&#xff0c;分析一下是什么原因造成的错误①引入laravel框架DB类useIlluminate\Support\Facades\DB;②开启框架日志记录DB::connect…

浅谈Spring之@Nullable、@NonNull注解

NonNull 可以标注在方法、字段、参数之上&#xff0c;表示对应的值不可以为空 Nullable 注解可以标注在方法、字段、参数之上&#xff0c;表示对应的值可以为空

事务概念和事务四大特性和隔离级别

什么是事务 事务四大特性 原生的JDBC事务处理 事务的隔离级别

squid mysql认证_Squid 3.1.7通过mysql_auth方式认证

Squid 3.1.7通过mysql_auth方式认证(FreeBSD平台)一、下载相应软件及补丁#fetch http://people.arxnet.hu/airween/mysql_auth/mysql_auth-0.8.tar.gz#tar xvzf mysql_auth-0.8.tar.gz#cd mysql_auth-0.8#patch -p1 < ../additionalselect.patchpatching file src/confparse…