PEANUT-WF模块开发-HslCommunicationEx

虽然表面上是基于HslCommunication进行扩展,但是大部分通讯都是独立不与Hsl直接相关,有一些通讯HSL是已存在的,但是未使用,还是基于经验和现有代码进行扩展,HslCommunicationEx通讯主要分实现部分和网络设备操作部分和实体部分,如果实现部分HslCommunication已经存在,那么可能扩展了网络设备操作部分;
HslCommunication
网络设备操作基类BaseNetDeviceOpr后续网络操作对象将不再赘述
属性:

        /// <summary>/// 记录容量/// </summary>public int RecordCapacity { get; set; } = 50;/// <summary>/// 是否自动记录/// </summary>public bool IsAutoRecord { get; set; } = true;/// <summary>/// 读写操作触发/// </summary>public Action<CommRecordInfo> CommRecordHandler { get; set; }/// <summary>/// 通讯记录完成(集合达到指定容量)/// </summary>public Action<string,Queue<CommRecordInfo>> CommRecordCompletedHandler { get; set; }/// <summary>///     大小端/// </summary>public EndianModeEnum EndianMode { get; set; } = EndianModeEnum.Big;

方法:

        /// <summary>///     读取实体单个数据/// </summary>/// <typeparam name="T"></typeparam>/// <param name="exp">表达式</param>/// <param name="len">自定义读长度</param>/// <returns></returns>public virtual OperateResult ReadSingle<T>(Expression<Func<T, object>> exp, ushort len = 0)/// <summary>///     读取实体单个数据/// </summary>/// <typeparam name="T"></typeparam>/// <param name="filedName">属性名称</param>/// <param name="len">自定义读长度</param>/// <returns></returns>public abstract OperateResult ReadSingle<T>(string filedName, ushort len = 0);/// <summary>///     读实体/// </summary>/// <typeparam name="T"></typeparam>/// <param name="dstT">实体对象</param>/// <returns></returns>public abstract Tuple<T, OperateResult> ReadEntityMuti<T>(T dstT)where T : class, new();/// <summary>///     写单个/// </summary>/// <typeparam name="T"></typeparam>/// <param name="filedName">属性名称</param>/// <param name="value">写数值</param>/// <param name="attempTimes">失败后尝试次数</param>/// <param name="attempInterval">失败后尝试多次发送时间间隔</param>/// <returns></returns>public abstract OperateResult WriteEntitySingle<T>(string filedName, dynamic value, ushort attempTimes = 0,ushort attempInterval = 30)where T : class, new();/// <summary>/// 写单个/// </summary>/// <param name="entityType"></param>/// <param name="filedName"></param>/// <param name="value"></param>/// <param name="attempTimes"></param>/// <param name="attempInterval"></param>/// <returns></returns>public virtual OperateResult WriteEntitySingle(Type entityType, string filedName, dynamic value, ushort attempTimes = 0, ushort attempInterval = 30)/// <summary>///     写单个/// </summary>/// <typeparam name="T"></typeparam>/// <param name="exp">表达式</param>/// <param name="value">发送数值</param>/// <param name="attempTimes">失败后尝试次数</param>/// <param name="attempInterval">失败后尝试多次发送时间间隔</param>/// <returns></returns>public virtual OperateResult WriteEntitySingle<T>(Expression<Func<T, object>> exp, dynamic value,ushort attempTimes = 0, ushort attempInterval = 30)where T : class, new()/// <summary>///     写多个/// </summary>/// <typeparam name="T"></typeparam>/// <param name="entity">实体对象</param>/// <param name="exp">表达式</param>/// <param name="attempTimes">失败后尝试次数</param>/// <param name="attempInterval">失败后尝试多次发送时间间隔</param>/// <returns></returns>public abstract OperateResult WriteEntityMuti<T>(T entity, Expression<Func<T, object>> exp,ushort attempTimes = 0,ushort attempInterval = 30)where T : class, new();/// <summary>///     数据类型转换/// </summary>/// <param name="dataType">数据类型枚举</param>/// <param name="values">byte数组</param>/// <param name="startIndex">开始索引</param>/// <param name="bitIndex">位数</param>/// <returns></returns>public virtual dynamic GetValueDynamic(DataTypeEnum dataType, byte[] values, int startIndex, int bitIndex)/// <summary>///  数据类型转换/// </summary>/// <param name="property">属性</param>/// <param name="values">byte数组</param>/// <param name="startIndex">开始索引</param>/// <param name="bitIndex">位数</param>/// <returns></returns>public virtual dynamic GetValueDynamic(PropertyInfo property, byte[] values, int startIndex, int bitIndex)/// <summary>///     数据类型转换/// </summary>/// <param name="dataType">类型</param>/// <param name="values">byte数组</param>/// <param name="startIndex">开始索引</param>/// <param name="bitIndex">位数</param>/// <returns></returns>public virtual dynamic GetValueDynamic(Type dataType, byte[] values, int startIndex, int bitIndex)/// <summary>///     根据数据类型对动态类型进行约束/// </summary>/// <param name="property">属性</param>/// <param name="comData">ComDataAttribute特性对象</param>/// <param name="value">需要格式化的数值</param>/// <returns></returns>public virtual int GetValue(PropertyInfo property, ComDataAttribute comData, ref dynamic value)/// <summary>///     根据数据类型对动态类型进行约束/// </summary>/// <param name="type">数据类型</param>/// <param name="comData">ComDataAttribute特性对象</param>/// <param name="value">需要格式化的数值</param>/// <returns></returns>public virtual int GetValue(Type type, ComDataAttribute comData, ref dynamic value)/// <summary>/// 不同类型所占字节数量/// </summary>/// <param name="propertyInfo"></param>/// <param name="comData"></param>/// <returns></returns>public virtual ushort GetByteCount(PropertyInfo propertyInfo, ComDataAttribute comData)/// <summary>/// 不同类型所占字节数量/// </summary>/// <param name="type"></param>/// <param name="comData"></param>/// <returns></returns>public virtual ushort GetByteCount(Type type, ComDataAttribute comData)/// <summary>///     根据ComDataAttribute中定义类型对动态类型进行约束/// </summary>/// <param name="dataType">数据类型</param>/// <param name="value">需要格式化的数值</param>public virtual void GetValue(DataTypeEnum dataType, ref dynamic value)/// <summary>///     检查属性ComDataAttribute是否可读/// </summary>/// <param name="property">属性</param>/// <returns></returns>public virtual Tuple<OperateResult, ComDataAttribute> CheckReadAdr(PropertyInfo property)/// <summary>///     检查属性ComDataAttribute是否可读/// </summary>/// <param name="property">属性</param>/// <returns></returns>public virtual Tuple<OperateResult, ComDataAttribute> CheckWriteAdr(PropertyInfo property)/// <summary>/// 与运算/// </summary>/// <typeparam name="T"></typeparam>/// <param name="entity">实体对象</param>/// <param name="exp">表达式</param>/// <param name="joinBuf">需要合并运算的结合</param>/// <returns></returns>public virtual bool AndResult<T>(T entity, Expression<Func<T, object>> exp,IEnumerable<bool> joinBuf = null)/// <summary>/// 或运算/// </summary>/// <typeparam name="T"></typeparam>/// <param name="entity">实体对象</param>/// <param name="exp">表达式</param>/// <param name="joinBuf">需要合并运算的结合</param>/// <returns></returns>public virtual bool OrResult<T>(T entity, Expression<Func<T, object>> exp, IEnumerable<bool> joinBuf = null)/// <summary>/// 读取结果只使用byte[]和基础类型/// </summary>/// <param name="value">当前读/写数值</param>/// <param name="commAb">修饰特性</param>/// <param name="dstType">目标数据类型</param>/// <param name="endiaMode">大小端</param>public dynamic EndiaModeForamt(dynamic value, ComDataAttribute commAb,Type dstType,EndianModeEnum endiaMode)/// <summary>/// 变量监控初始化/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>public abstract DataTable CreateDsSchema<T>()where T : class, new();/// <summary>/// 获取数据源结构/// </summary>/// <typeparam name="T"></typeparam>/// <typeparam name="TAb"></typeparam>public DataTable CreateDsSchema<T,TAb>()where TAb:ComDataAttribute/// <summary>/// 手动刷新填充数据/// </summary>/// <typeparam name="T"></typeparam>/// <typeparam name="TAb"></typeparam>/// <param name="entity"></param>public void RecordRefreshManual<T, TAb>(T entity)where TAb : ComDataAttribute/// <summary>/// 获取变量监控记录/// </summary>/// <param name="name"></param>/// <returns></returns>public Queue<CommRecordInfo> GetRecordQueue(string name)

1.西门S7通讯(Hsl已经实现)网络设备操作对象为NetWorkDeviceOpr

1.1基类BaseSieCpuNdo

        /// <summary>/// 具体的西门子PLC型号/// </summary>public SiemensPLCS? SiePlcModel { get; set; }/// <summary>/// 数据解析用到的大小端配置/// </summary>public EndianModeEnum? EndianMode { get; set; }/// <summary>/// S7扩展对象/// </summary>public SiemensS7NetEx SieS7Net => _sieS7Net;/// <summary>/// 网络设备操作对象/// </summary>public NetWorkDeviceOpr NetWorkDeviceOpr;/// <summary>/// 连接超时设定/// </summary>public int ConTimeOut { get; set; } = 1000;/// <summary>/// 设备名称/// </summary>public string Name { get; set; }/// <summary>/// 连接状态/// </summary>public bool IsConnected => _sieS7Net?.IsConnected == true;/// <summary>/// 发送失败后尝试再次发送次数/// </summary>public ushort AttempSendTimes { get; set; } = 2;/// <summary>/// 发送失败再次尝试时间间隔/// </summary>public ushort AttempInterval { get; set; } = 30;/// <summary>/// 连接之前ping/// </summary>public bool IsPing { get; set; }

方法

        /// <summary>/// 手动开始,监控初始化,推荐/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sieCpu">西门子PLC</param>/// <param name="endian">大小端</param>/// <param name="slot">槽号</param>/// <param name="rack">机架号</param>/// <param name="port">端口默认102</param>/// <returns></returns>public OperateResult Start<T>(SiemensPLCS sieCpu, Peanut.AutoSulution.EDC.EndianModeEnum endian, byte? slot = null, byte? rack = null, int? port = null)where T:class,new()/// <summary>/// 释放连接/// </summary>public virtual void Dispose()/// <summary>/// 发送单个/// </summary>/// <typeparam name="T"></typeparam>/// <param name="exp"></param>/// <param name="value"></param>/// <returns></returns>public virtual OperateResult WriteSingle<T>(Expression<Func<T, object>> exp, dynamic value)where T : class, new()/// <summary>/// 发送单个/// </summary>/// <param name="entityType"></param>/// <param name="fileName"></param>/// <param name="value"></param>/// <returns></returns>public virtual OperateResult WriteSingle(Type entityType,string fileName, dynamic value)/// <summary>/// 读取多个/// </summary>/// <typeparam name="T"></typeparam>/// <param name="exp"></param>/// <param name="value"></param>/// <returns></returns>public virtual Tuple<T, OperateResult> ReadEntityMuti<T>(Expression<Func<T, object>> exp)where T : class, new()/// <summary>/// 读取实体/// </summary>/// <typeparam name="T"></typeparam>/// <param name="dstT"></param>/// <returns></returns>public virtual Tuple<T, OperateResult> ReadEntityMuti<T>(T dstT)where T : class, new()/// <summary>/// 发送单个/// </summary>/// <typeparam name="T"></typeparam>/// <param name="filedName"></param>/// <param name="value"></param>/// <returns></returns>public virtual OperateResult WriteSingle<T>(string filedName, dynamic value)where T : class, new()/// <summary>/// 发送多个/// </summary>/// <typeparam name="T"></typeparam>/// <param name="t"></param>/// <param name="exp"></param>/// <returns></returns>public virtual OperateResult WriteMultiple<T>(T t, Expression<Func<T, object>> exp)where T : class, new()/// <summary>/// 连接成功以后执行一次/// </summary>public virtual void ExcuteOnce()/// <summary>/// ping/// </summary>/// <param name="ip"></param>/// <param name="timeout"></param>/// <returns></returns>public bool Ping(string ip,int timeout=3000)

示例
1.创建实体-用代码生成器生成

        /// <summary>/// 通讯实体/// </summary>public Sie828DEntity Entity { get; set; }= new Sie828DEntity();


2.初始化设置

            //初始化配置//失败后尝试发送次数base.AttempSendTimes = 2;//失败后尝试发送次数时间间隔base.AttempInterval = 30;//连接超时时间base.ConTimeOut = 2000;

3.实时通讯

        /// <summary>/// 通过系统任务管理器(框架中)/// 实时读取信息/// </summary>[TaskCom(true,100,deleyTime:3000)]private void ReadHigh(){try{RequestData(() => {//监控数据源自动初始化Start<Sie828DEntity>(SiemensPLCS.S300, EndianModeEnum.Big);},() =>{var ret = NetWorkDeviceOpr.ReadEntityMuti(Entity);},3000);}catch (Exception ex){//log}}

2.ModbusTCP/IP网络设备操作对象为MbTcpDeviceOpr,

2.1通讯实现对象MbTcpMaster

        /// <summary>接收数据错误事件</summary>public delegate void ExceptionData(ushort id, byte function, byte exception);/// <summary>接收数据响应事件</summary>public delegate void ResponseData(ushort id, byte function, byte[] data);/// <summary>接收数据响应事件</summary>public event ResponseData OnResponseData;/// <summary>接收数据错误事件</summary>public event ExceptionData OnException;/// <summary>///     服务器IP/// </summary>public string IpAddress { get; set; }/// <summary>///     服务器端口默认502/// </summary>public int Port { get; set; } = 502;/// <summary>///     站号/// </summary>public byte Station { get; set; }/// <summary>超时时间</summary>public int ConnectTimeOut { get; set; } = 3000;/// <summary>/// 读写请求超时/// </summary>public int RequestTimeout { get; set; } = 2000;/// <summary>刷新从站时间</summary>/// <value>默认10ms.</value>public ushort Refresh/// <summary>连接状态</summary>public bool IsConnected => _tcpSynCl?.Connected == true;/// <summary>/// </summary>/// <param name="serverIniEnum">///     初始化连接个数设置,只创建异步socket对象或者只创建同步socket对象///     如果全部创建需要根据服务器设置相邻两次连接的最短等待连接时间,否则可能会会造成后者连接被服务器中断,以昆仑通泰触摸屏为例/// </param>/// <param name="waitTime"></param>/// <returns></returns>public OperateResult ConnectServer(ServerIniEnum serverIniEnum = ServerIniEnum.SyncSocket, int waitTime = 500)/// <summary>断开连接</summary>public void Disconnect()/// <summary>释放连接</summary>public void Dispose()/// <summary>异步读线圈</summary>-/// <param name="startAddress">读起始地址</param>/// <param name="numInputs">数据长度</param>public void ReadCoilsAsync(ushort startAddress, ushort numInputs, ushort id = 0)/// <summary>同步方式读线圈</summary>/// <param name="id">唯一的ID跟随数据返回</param>/// <param name="startAddress">读起始地址</param>/// <param name="numInputs">数据长度</param>public OperateResult<bool[]> ReadCoilsSync(ushort startAddress, ushort numInputs, ushort id = 0)// <summary>读离散型输入异步</summary>/// <param name="id">ID</param>/// <param name="startAddress">起始地址</param>/// <param name="numInputs">数据长度</param>public void ReadDiscreteInputsAsync(ushort startAddress, ushort numInputs, ushort id = 0)/// <summary>读离散型输入同步</summary>/// <param name="id">ID</param>/// <param name="startAddress">起始地址</param>/// <param name="numInputs">数据长度</param>/// <param name="timeout"></param>public OperateResult<bool[]> ReadDiscreteInputsSync(ushort startAddress, ushort numInputs, ushort id = 0)/// <summary>异步读寄存器</summary>/// <param name="id">ID</param>/// <param name="startAddress">起始地址</param>/// <param name="numInputs">数据长度</param>public void ReadHoldingRegisterAsync(ushort startAddress, ushort numInputs, ushort id = 0, byte? cusFunc = null)/// <summary>同步读寄存器</summary>/// <param name="id">ID</param>/// <param name="startAddress">起始地址</param>/// <param name="numInputs">数据长度</param>public OperateResult<byte[]> ReadHoldingRegisterSync(ushort startAddress, ushort numInputs, ushort id = 0)/// <summary>异步读输入寄存器</summary>/// <param name="id">ID</param>/// <param name="startAddress">起始地址</param>/// <param name="numInputs">数据长度</param>public void ReadInputRegisterAsync(ushort startAddress, ushort numInputs, ushort id = 0)/// <summary>同步读输入寄存器</summary>/// <param name="id">ID</param>/// <param name="startAddress">起始地址</param>/// <param name="numInputs">数据长度</param>public OperateResult<byte[]> ReadInputRegisterSync(ushort startAddress, ushort numInputs, ushort id = 0)/// <summary>写单个寄存器</summary>/// <param name="id">ID</param>/// <param name="startAddress">起始地址</param>/// <param name="onOff">置位或者复位</param>public void WriteSingleCoilsAsync(ushort startAddress, bool onOff, ushort id = 0)/// <summary>同步写单线圈</summary>/// <param name="id">ID.</param>/// <param name="startAddress">起始地址</param>/// <param name="onOff">置位复位</param>public OperateResult<byte[]> WriteSingleCoilsSync(ushort startAddress, bool onOff, ushort id = 0)/// <summary>异步写多线圈</summary>/// <param name="id">ID</param>/// <param name="startAddress">起始地址</param>/// <param name="numBits">位个数</param>/// <param name="values">以字节形式返回位信息</param>public void WriteMultipleCoilsAsync(ushort id, ushort startAddress, ushort numBits, byte[] values)/// <summary>同步写多个线圈</summary>/// <param name="id">ID</param>/// <param name="startAddress">起始地址</param>/// <param name="values">以字节形式返回位信息</param>public OperateResult<byte[]> WriteMultipleCoilsSync(ushort startAddress, bool[] values, ushort id = 0)/// <summary>异步写单个寄存器</summary>/// <param name="id">ID</param>/// <param name="startAddress">起始地址</param>/// <param name="values">寄存器信息</param>public void WriteSingleRegisterAsync(ushort id, ushort startAddress, byte[] values)/// <summary>写单个寄存器信息</summary>/// <param name="id">ID</param>/// <param name="startAddress">起始地址</param>/// <param name="values">寄存器信息</param>public OperateResult<byte[]> WriteSingleRegisterSync(ushort id, ushort startAddress, byte[] values)/// <summary>异步写多个寄存器</summary>/// <param name="id">ID</param>/// <param name="startAddress">起始地址</param>/// <param name="values">寄存器信息</param>public void WriteMultipleRegisterAsync(ushort id, ushort startAddress, byte[] values)/// <summary>同步写多线圈</summary>/// <param name="id">ID</param>/// <param name="startAddress">起始地址</param>/// <param name="values">寄存器信息</param>public OperateResult<byte[]> WriteMultipleRegisterSync(ushort startAddress, byte[] values, ushort id = 0)/// <summary>异步读写寄存器</summary>/// <param name="id">ID</param>/// <param name="startReadAddress">起始读地址</param>/// <param name="numInputs">数据长度</param>/// <param name="startWriteAddress">起始写地址</param>/// <param name="values">寄存器信息</param>public void ReadWriteMultipleRegisterAsync(ushort id, ushort startReadAddress, ushort numInputs,ushort startWriteAddress, byte[] values)/// <summary>同步读/写多个寄存器</summary>/// <param name="id">ID</param>/// <param name="startReadAddress">读起始地址</param>/// <param name="numInputs">数据长度</param>/// <param name="startWriteAddress">写数据起始地址</param>/// <param name="values">寄存器信息</param>public OperateResult<byte[]> ReadWriteMultipleRegisterSync(ushort startReadAddress, ushort numInputs,ushort startWriteAddress, byte[] values, ushort id = 0)

示例
1.创建实体-使用代码生成器

2.初始化

        /// <summary>/// 设备管理对象/// </summary>public MbTcpDeviceOpr MbTcpDeviceOpr;/// <summary>/// 通讯实现对象/// </summary>private MbTcpMaster _mbTcpMaster;/// <summary>/// 连接状态/// </summary>public bool IsConnected => _mbTcpMaster?.Connected == true;/// <summary>/// 实体/// </summary>public MbEntity Entity { get; set; }=new MbEntity();/// <summary>/// IP/// </summary>public string Ip { get; set; }/// <summary>/// 连接/// </summary>/// <returns></returns>public OperateResult Connect(){if (_mbTcpMaster == null)_mbTcpMaster = new MbTcpMaster{IpAddress = Ip,Port = 502,ConnectTimeOut = 5000,Station = 1};if (MbTcpDeviceOpr == null)MbTcpDeviceOpr = new MbTcpDeviceOpr(_mbTcpMaster){EndianMode = EndianModeEnum.Big};return _mbTcpMaster.ConnectServer();}

3.创建设备对象建立实时通讯

        /// <summary>/// 通过系统任务管理器/// 实时读取信息/// </summary>[TaskCom(true, 100, deleyTime: 3000)]private void ReadHigh(){try{//未连接情况下,建立连接(重连)if(!IsConnected){var ret = Connect();if (!ret.IsSuccess){Thread.Sleep(3000);}return;}else{MbTcpDeviceOpr.ReadEntityMuti(Entity);}}catch (Exception ex){//log}}

3.MQTT-具体参考DEMO

3.1MqttClient-MqttNetClient

        /// <summary>/// IMqttClient/// </summary>public IMqttClient MqtClient { get; set; }/// <summary>/// IMqttNetLogger/// </summary>public IMqttNetLogger ClientLogger { get; } = new MqttNetLogger();/// <summary>/// 是否清空节点/// </summary>public bool ClearSession { get; set; }/// <summary>/// 检测客户端在线周期*1.5/// </summary>public int KeepAliveSeconds { get; set; }/// <summary>/// 连接状态/// </summary>public bool IsConnected=> MqtClient?.IsConnected == true;/// <summary>/// 重连周期/// </summary>public int ReconnectInterval { get; set; } = 2000;/// <summary>/// 连接以后/// </summary>public Action<MqttClientConnectedEventArgs> ActOnConnectedHandler { get; set; }/// <summary>/// 断开连接/// </summary>public Action<MqttClientDisconnectedEventArgs> ActOnDisConnectedHandler { get; set; }/// <summary>/// 接收到消息以后/// </summary>public Action<MqttApplicationMessageReceivedEventArgs> ActOnMessageReceivedHandler { get; set; }/// <summary>/// 事件处理异常/// </summary>public Action<Exception> ErrorHandler { get; set; }/// <summary>/// 允许重连/// </summary>public bool AllowReconnect { get; set; } = true;/// <summary>/// 连接服务器/// </summary>/// <param name="server">服务器</param>/// <param name="port">端口</param>/// <param name="userName">用户名</param>/// <param name="pwd">密码</param>/// <param name="clientId">clientId</param>/// <param name="timeout">超时</param>/// <param name="mqttClientType">协议类型</param>/// <param name="version">版本</param>/// <returns></returns>public async Task<bool> Connect(string server, int port, string userName, string pwd, string clientId, int timeout = 3000,MqttClientTypeEnum mqttClientType = MqttClientTypeEnum.Tcp, MqttProtocolVersion version = MqttProtocolVersion.V500)/// <summary>/// 连接服务器/// </summary>/// <param name="server">服务器</param>/// <param name="port">端口</param>/// <param name="userName">用户名</param>/// <param name="pwd">密码</param>/// <param name="clientId">clientId</param>/// <param name="timeout">超时</param>/// <param name="mqttClientType">协议类型</param>/// <param name="version">版本</param>/// <returns></returns>public async Task<IMqttClient> Connect2(string server, int port,string userName,string pwd,string clientId,int timeout=3000,MqttClientTypeEnum mqttClientType=MqttClientTypeEnum.Tcp,MqttProtocolVersion version=MqttProtocolVersion.V500)/// <summary>/// ping/// </summary>/// <returns></returns>public async Task SendManualPing()/// <summary>/// RPC订阅方法/// </summary>/// <param name="client">客户端</param>/// <param name="methodName">方法名称</param>/// <param name="rcvHandler">接收回调</param>/// <returns></returns>public async Task<bool> RpcSubMethod(IMqttClient client, string methodName,Func<MqttApplicationMessageReceivedEventArgs,byte[]> rcvHandler)/// <summary>/// 创建RPC发布客户端并调用方法/// </summary>/// <param name="client">客户端</param>/// <param name="methodName">方法名称</param>/// <param name="sendBuf">发送信息</param>/// <param name="timeout">超时</param>/// <returns></returns>public async Task<byte[]> RpcPubExcute(IMqttClient client, string methodName,byte[] sendBuf,int timeout=30000)/// <summary>/// 执行RPC/// </summary>/// <param name="server">服务器</param>/// <param name="port">端口</param>/// <param name="methodName">方法名称</param>/// <param name="sendBuf">发送信息</param>/// <param name="timeout">设定超时</param>/// <returns></returns>public async Task<byte[]> RpcPubExcute(string server,int port, string methodName, byte[] sendBuf, int timeout = 30000)

3.2MqttServer-MqttNetServer

        /// <summary>/// 是否权限/// </summary>public bool IsAuthorize { get; set; } = true;/// <summary>/// 用户信息/// </summary>public Dictionary<string, string> _dicUser = new Dictionary<string, string>();/// <summary>/// 服务器启动/// </summary>public Action<EventArgs> ActOnMqttServerStarted { get; set; }/// <summary>/// 服务器停止/// </summary>public Action<EventArgs> ActOnMqttServerStopped { get; set; }/// <summary>/// 客户端连接/// </summary>public Action<ClientConnectedEventArgs> ActOnMqttServerClientConnected { get; set; }/// <summary>/// 客户端断开/// </summary>public Action<ClientDisconnectedEventArgs> ActOnMqttClientDisconnected { get; set; }/// <summary>/// 订阅主题/// </summary>public Action<ClientSubscribedTopicEventArgs> ActClientSubscribedTopicAsync { get; set; }/// <summary>/// 取消订阅主题/// </summary>public Action<ClientUnsubscribedTopicEventArgs> ActClientUnsubscribedTopicAsync { get; set; }/// <summary>/// 接收消息/// </summary>public Action<MqttApplicationMessageReceivedEventArgs> ActOnMqttServerApplicationMessageReceived { get; set; }/// <summary>/// 事件处理异常/// </summary>public Action<Exception> ErrorHandler { get; set; }/// <summary>/// /// </summary>public MqttNetLogger Logger => _logger;/// <summary>/// 启动服务/// </summary>/// <param name="port"></param>/// <param name="userName"></param>/// <param name="pwd"></param>public async void StartMqttServer(int port, string userName, string pwd)/// <summary>/// 停止服务器/// </summary>/// <returns></returns>public async Task StopMqttServer()// <summary>/// 新增用户/// </summary>/// <param name="userName"></param>/// <param name="pwd"></param>public void AddUser(string userName, string pwd)/// <summary>/// 移除用户/// </summary>/// <param name="userName"></param>/// <param name="pwd"></param>public void RemoveUser(string userName)

4.OPC UA

4.1.OPC UA Client-OpcUaSiemens设备管理对象OpcUaDeviceOpr具体参考DEMO

        /// <summary>/// 最大请求数量/// </summary>public readonly int MaxRequestCount = 100;/// <summary>///     连接节点/// </summary>protected Session MSession;/// <summary>/// 是否已经释放/// </summary>public bool IsDisposed => MSession?.Disposed == true;/// <summary>/// 读超时/// </summary>public int ReadTimeout { get; set; } = 3000;/// <summary>/// 写超时/// </summary>public int WriteTimeout { get; set; } = 3000;/// <summary>///     连接状态/// </summary>public bool IsConnected { get; set; }/// <summary>/// </summary>/// <param name="url">服务器地址</param>/// <param name="nameSpace">命名空间</param>/// <param name="timeout"></param>/// <param name="userName">用户名</param>/// <param name="password">密码</param>/// <returns></returns>public OperateResult Connect(string url, string nameSpace, int timeout = 5000, string userName = "",string password = "")/// <summary>Establishes the connection to an OPC UA server and creates a session using a server url.</summary>/// <param name="url">The Url of the endpoint as string.</param>/// <param name="nameSpace"></param>/// <param name="secPolicy">The security policy to use</param>/// <param name="msgSecMode">The message security mode to use</param>/// <param name="timeout"></param>/// <param name="userAuth">Autheticate anonymous or with username and password</param>/// <param name="userName">The user name</param>/// <param name="password">The password</param>/// <exception cref="Exception">Throws and forwards any exception with short error description.</exception>public OperateResult Connect(string url, string nameSpace, string secPolicy, MessageSecurityMode msgSecMode,int timeout, bool userAuth,string userName, string password)/// <summary>///     读单个/// </summary>/// <param name="adr"></param>/// <returns></returns>public OperateResult<DataValue> ReadSingle(string adr)/// <summary>/// 读取多个/// </summary>/// <param name="dataAdr">地址</param>/// <returns></returns>public OperateResult<List<string>> ReadMultiStr(List<string> dataAdr)/// <summary>///     多地址统一读取/// </summary>/// <param name="dataAdr"></param>/// <returns></returns>public OperateResult<List<DataValue>> ReadMulti(List<string> dataAdr)/// <summary>///     写单个/// </summary>/// <param name="adr"></param>/// <param name="value"></param>/// <returns></returns>public OperateResult WriteSingle(string adr, dynamic value)/// <summary>///     写多个/// </summary>/// <param name="updateEntities"></param>/// <returns></returns>public OperateResult WriteMuti(List<DataValueEntity> updateEntities)/// <summary>///     写单个/// </summary>/// <param name="values"></param>/// <returns></returns>public OperateResult WriteMuti(WriteValueCollection values)/// <summary>/// 调用方法/// </summary>/// <param name="functionName">方法名称</param>/// <param name="inputArguments">输入参数</param>/// <returns></returns>public MethodCallResult MethodCall(string path,string fullName, params object[] inputArguments)/// <summary>///     关闭释放/// </summary>public void Close()

示例
Entity-使用代码生成器生成

Device

        /// <summary>///     URL/// </summary>private string _url;/// <summary>///     发送失败再次尝试时间间隔/// </summary>public ushort AttempInterval{ get; set; } = 30;/// <summary>///     发送失败后尝试再次发送次数/// </summary>public ushort AttempSendTimes{ get; set; } = 2;public OpcUaDevice(){OpcUaSie = new OpcUaSiemens();}/// <summary>///     网络设备操作对象/// </summary>public OpcUaDeviceOpr OpcUaDeviceOpr { get; set; }/// <summary>///     OPC UA/// </summary>public OpcUaSiemens OpcUaSie { get; set; }/// <summary>///     Ip/// </summary>public string IpAdr { get; set; }/// <summary>///     端口/// </summary>public int Port { get; set; }/// <summary>///     URL格式化信息/// </summary>public string UrlFormat { get; set; } = "opc.tcp://{0}:{1}";/// <summary>///     命名空间/// </summary>public string Namespace { get; set; } = "http://localhost/VarIF_Bridge";/// <summary>///     simotionD连接状态/// </summary>public bool IsConnected => OpcUaSie?.IsConnected == true;/// <summary>///     连接超时/// </summary>public int ConTimeout { get; set; } = 50000;/// <summary>///     读写超时/// </summary>public int ReadWriteTimeout { get; set; } = 3000;/// <summary>///     用户名/// </summary>public string UserName { get; set; } = "";/// <summary>///     密码/// </summary>public string Pwd { get; set; }/// <summary>///     通讯实体/// </summary>public OpcUaEntityEntity { get; set; }= new OpcUaEntity();/// <summary>///     初始化建立连接///     使用必要的属性设置(IpAdr、Port、UrlFormat)/Url、Namespace、(UserName、Pwd根据实际需要配置)/// </summary>public OperateResult Connect(){try{if (OpcUaSie == null)OpcUaSie = new OpcUaSiemens();if (string.IsNullOrWhiteSpace(_url))_url = string.Format(UrlFormat, IpAdr, Port);if (OpcUaDeviceOpr == null)OpcUaDeviceOpr = new OpcUaDeviceOpr(OpcUaSie) { EndianMode = AutoSolutionCore.EDC.EndianModeEnum.Little };var result = OpcUaSie.Connect(_url, Namespace, ConTimeout, UserName, Pwd);return result;}catch (Exception ex){throw new Exception("OPC UA连接失败BaseIni", ex);}}/// <summary>///     手动连接输入必要的所有参数/// </summary>/// <param name="ipAdr">ip地址</param>/// <param name="port">端口</param>/// <param name="namespaceStr">命名空间</param>/// <param name="urlFormat">URL连接格式化如:"opc.tcp://{IpAdr}:{Port}"</param>/// <param name="userName">用户名</param>/// <param name="pwd">密码</param>/// <param name="timeout">超时</param>/// <returns></returns>public OperateResult Connect(string ipAdr, int port, string namespaceStr, string urlFormat, string userName,string pwd, int timeout){Namespace = namespaceStr ?? throw new ArgumentNullException(nameof(namespaceStr));UserName = userName;Pwd = pwd;_url = string.Format(UrlFormat, IpAdr, Port);return Connect(_url, namespaceStr, UserName, Pwd, timeout);}/// <summary>///     手动连接输入必要的所有参数/// </summary>/// <param name="url">连接资源地址</param>/// <param name="namespaceStr">命名空间地址</param>/// <param name="userName">用户名</param>/// <param name="pwd">密码</param>/// <param name="timeout">连接超时设定</param>/// <returns></returns>public OperateResult Connect(string url, string namespaceStr, string userName, string pwd, int timeout){_url = url ?? throw new ArgumentNullException(nameof(url));Namespace = namespaceStr ?? throw new ArgumentNullException(nameof(namespaceStr));UserName = userName;Pwd = pwd;OperateResult result = new OperateResult {IsSuccess = true, Message = "连接成功"};OpcUaDeviceOpr = new OpcUaDeviceOpr(OpcUaSie);if (!IsConnected) result = OpcUaSie.Connect(_url, Namespace, ConTimeout, UserName, Pwd);return result;}/// <summary>///     实时读任务/// </summary>[TaskCom(true, 100, deleyTime: 3000)]private void ReadHigh(){try{if (!IsConnected){var ret = Connect();if (!ret.IsSuccess){Thread.Sleep(3000);}return;}else{OpcUaDeviceOpr.ReadEntityMuti(Entity);}}catch (Exception ex){//log}}

4.2 OPC Server-DEMO

ServiceStart-DEMO配合OpcUaNodeConfig.config使用

        /// <summary>/// 启动 opc ua服务器/// </summary>/// <typeparam name="T"></typeparam>/// <param name="port"></param>/// <param name="nameSpace"></param>public static void StartOpcUaService<T>(int port = 4810, string nameSpace = "SYTLTechnology", string userName = "", string pwd = "")where T : PeanutOpcUaNodeManager

5.PeanutNC-基于Http的自定义开发接口(840D/828D-WIN/Linux)-SiePeanutClient

实体
使用CapComDataAttribute进行属性修饰
由于是继承:BaseNetDeviceOpr,所以方法请参考BaseNetDeviceOpr

        /// <summary>/// 服务器IP/// </summary>public string ServerIp{get => _serverIp;set { _serverIp = value; }}/// <summary>/// 端口/// </summary>public int Port{get => _port;set { _port = value; }}/// <summary>/// 读超时/// </summary>public int ReadTimeout { get; set; } = 30000;/// <summary>/// 写超时/// </summary>public int WriteTimeout { get; set; } = 30000;

6.RibbitMQ-RabbitMqClient

        /// <summary>/// 主机名/// </summary>public string HostName { get; set; } = "localhost";/// <summary>/// 用户名/// </summary>public string UserName { get; set; }/// <summary>/// 用户密码/// </summary>public string Password { get; set; }/// <summary>/// 连接地址/// </summary>public string Uri { get; set; }/// <summary>/// 虚拟服务器,相当于不同数据库一样,独立运行/// </summary>public string VirtualHost { get; set; }/// <summary>/// 自动重连间隔/// </summary>public int ReconnectInterval { get; set; } = 3000;/// <summary>/// 连接超时设置/// </summary>/// <summary>/// 连接超时设置/// </summary>public int RequestConnectionTimeout { get; set; } = 2000;/// <summary>/// 发布使用通道是否处于打开状态/// </summary>/// <param name="mode"></param>/// <returns></returns>public bool? IsPublishOpen(RmqCommModeEnum mode)/// <summary>/// 订阅使用通道是否处于打开状态/// </summary>/// <param name="mode"></param>/// <returns></returns>public bool? IsSubscribeOpen(RmqCommModeEnum mode)/// <summary>/// 检测是否允许建立连接/// </summary>/// <returns></returns>public OperateResult CheckConnection()/// <summary>/// 创建连接/// </summary>/// <returns></returns>public IConnection CreateConnection()/// <summary>/// 开始接收消息/// </summary>/// <param name="queueName">消息队列名称</param>/// <param name="reconnectInterval">自动重连间隔</param>/// <param name="requestConnectionTimeout">连接超时设置</param>/// <param name="autoAck">是否自动Ack</param>public void StartRcvMsg(string queueName, bool autoAck = true, Action<object, BasicDeliverEventArgs> rcvFunc = null)/// <summary>/// 发送消息/// </summary>/// <param name="queueName">队列名称</param>/// <param name="body">消息</param>public OperateResult SendMsg(string queueName, byte[] body, int waitForConfirmTime = 2000)/// <summary>/// 发送消息/// </summary>/// <param name="queueName">队列名称</param>/// <param name="body">消息</param>public OperateResult SendMsg(string queueName, string exchange, string routingKey, byte[] body, int waitForConfirmTime = 2000)/// <summary>/// 简单模式消息处理/// </summary>/// <param name="channel"></param>/// <param name="s"></param>/// <param name="e"></param>protected void SimpleRcvMsg(IModel channel, object s, BasicDeliverEventArgs e)/// <summary>/// 订阅/// </summary>/// <param name="queueName">队列名称</param>/// <param name="exchange">交换器</param>/// <param name="routingKey">路由key</param>/// <param name="exchangeType">交换器类型</param>/// <param name="durable">持久化</param>/// <param name="expirationSecond">过期s</param>/// <param name="autoAck">自动确认</param>/// <param name="rcvFunc">接收回调</param>public OperateResult Subscribe(string queueName,string exchange, string routingKey, string exchangeType = "topic", bool durable = true, int expirationSecond = 0, bool autoAck = true, Action<object, BasicDeliverEventArgs> rcvFunc = null)/// <summary>/// 发布消息/// </summary>/// <param name="exchange">交换器</param>/// <param name="routingKey">路由key</param>/// <param name="body">消息</param>/// <param name="exchangeType">交换器类型</param>/// <param name="waitForConfirmTime">等待确认时间</param>/// <returns></returns>public OperateResult Publish(string queueName, string exchange, string routingKey, byte[] body, string exchangeType = "topic", bool durable = true, int expirationSecond = 0, int waitForConfirmTime = 2000)/// <summary>/// 发布消息/// </summary>/// <param name="exchange">交换器</param>/// <param name="routingKey">路由key</param>/// <param name="body">消息</param>/// <param name="exchangeType">交换器类型</param>/// <param name="waitForConfirmTime">等待确认时间</param>/// <returns></returns>public OperateResult Publish(string queueName, string exchange, string routingKey, string body, string exchangeType = "topic", bool durable = true, int expirationSecond = 0, int waitForConfirmTime = 2000)/// <summary>/// 释放/// </summary>public void Dispose()

7.串口基类-BaseSerialPort

        /// <summary>/// 接收数据事件/// </summary>public event RcvData rcvDataEventHandler;/// <summary>/// 通讯初始化/// </summary>/// <param name="timeOut">超时</param>/// <param name="sPortName">端口名</param>/// <param name="baudrate">波特率</param>/// <param name="dataBits">数据位</param>/// <param name="parity">校验</param>/// <returns></returns>public OperateResult ComInitial(string sPortName, int baudrate, int dataBits, string parity, int timeOut=3000)/// <summary>/// 返回校验位/// </summary>/// <param name="enterParity">校验方式</param>/// <returns></returns>protected Parity ReturnParity(string enterParity)/// <summary>/// 接收完成处理/// </summary>/// <param name="rcvBuf"></param>protected virtual void AfterRcvCompleted(OperateResult<byte[]> rcvBuf)/// <summary>/// 打开串口/// </summary>/// <returns></returns>protected OperateResult OpenPort()/// <summary>/// 关闭串口/// </summary>/// <returns></returns>public virtual OperateResult Dispose()/// <summary>/// 获取本地串口集合/// </summary>/// <returns></returns>public static string[] GetPorts()/// <summary>/// 发送数据/// </summary>/// <param name="sendData"></param>protected virtual OperateResult Write(byte[] sendData)/// <summary>/// 接收方式分为实时接收和事件接收/// </summary>/// <param name="arrayLength"></param>protected virtual OperateResult<byte[]> Read(int interval=30)/// <summary>/// 接收方式分为实时接收和事件接收/// </summary>/// <param name="arrayLength"></param>protected virtual OperateResult<byte[]> Read(int interval=30)/// <summary>/// 写以后立即读取/// </summary>/// <param name="sendData"></param>/// <param name="readInterval"></param>/// <returns></returns>protected virtual OperateResult<byte[]> ReadAfterWrite(byte[] sendData,int readInterval=30)

8.变量监控

1.设备实时读取变量监控数据源初始化
例如OpcUa

        //创建变量监控数据结构OpcUaDeviceOpr.CreateDsSchema<EntityDemo1, ComOpcUaDataAttribute>();

在西门子S7通讯中由于常常使用基类BaseSieCpuNdo所以在初始化连接的时候已经进行了如上的数据源初始化工作;

变量监控初始化与设备选择事件触发

        DeviceVarMonitorFrm _monitorFrm;_monitorFrm= new DeviceVarMonitorFrm(_sieS7Device.Name);_monitorFrm.CbSelectChanagedHandler += VarMonitorChanged;/// <summary>/// 变量监控/// </summary>/// <param name="cbText"></param>private void VarMonitorChanged(string cbText){if (cbText == _sieS7Device.Name){//旧版本//if (_sieS7Device.NetWorkDeviceOpr != null)//{//    var ds = _sieS7Device.NetWorkDeviceOpr.CreateDsSchema<Sie828DPLC, ComDataAttribute>();//    _deviceMonitorFrm.SetDs(ds);//}//新版本_monitorFrm.SetDs(_sieS7Device.NetWorkDeviceOpr?.DataBind);}}

9.其他通讯

9.1OPC DA在单独类库中

9.2其他HSL相关通讯,使用的时候会封装到网络设备管理对象中

9.3DDE(比较老旧的通讯)840D

9.4数据采集解决方案

9.4.1Fanuc
9.4.2GSK
9.4.3Heidainhen
9.4.4SIEMENS CNCS7
9.4.5OKUMA-待应用
9.4.6华中-待应用
9.4.7MITSUBISHI-待应用

PEANUT-WF模块开发-HslCommunicationEx相关推荐

  1. 客快物流大数据项目(五十三):实时ETL模块开发准备

    目录 实时ETL模块开发准备 一.编写配置文件 二.创建包结构 三.编写工具类加载配置文件 实时ETL模块开发准备 一.编写配置文件 在公共模块的resources目录创建配置文件:config.pr ...

  2. 服务器架设笔记——Apache模块开发基础知识

    通过上节的例子,我们发现Apache插件开发的一个门槛便是学习它自成体系的一套API.虽然Apache的官网上有对这些API的详细介绍,但是空拿着一些零散的说明书,是很难快速建立起一套可以运行的系统. ...

  3. Openresty最佳案例 | 第7篇: 模块开发、OpenResty连接Redis

    Lua模块开发 在实际的开发过程中,不可能把所有的lua代码写在一个lua文件中,通常的做法将特定功能的放在一个lua文件中,即用lua模块开发.在lualib目录下,默认有以下的lua模块. lua ...

  4. laravel5.2基础多模块开发(pingpong/modules)

    2019独角兽企业重金招聘Python工程师标准>>> 1.下载laravel5.2 http://laravelacademy.org/resources-download 2.解 ...

  5. [短彩信]C#短彩信模块开发设计(1)——架构

    准备从以下几个方面简单的谈谈短彩信模块的实现: [短彩信]C#短彩信模块开发设计(1)--架构(http://www.cnblogs.com/CopyPaster/archive/2012/12/07 ...

  6. Apache模块开发

    一.简介 Apache HTTP服务器是一个模块化的软件,使管理者可以选择核心中包含的模块以裁剪功能.可以在编译时选择被静态包含进httpd二进制映象的模块,也可以编译成独立于主httpd二进制映象的 ...

  7. Nginx模块开发入门

    前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并 ...

  8. STM32开发 -- 惯导模块开发详解

    如需转载请注明出处:https://juyou.blog.csdn.net/article/details/93476976 STM32开发 – GPS模块开发详解 这篇文章已经对于GPS模块开发讲得 ...

  9. DNN模块开发入门指导

    我是一个DNN初学者,我想知道学习DNN需要多长时间? 使用DNN搭建网站比较容易,只需要几天,如果使用现成的皮肤和模块(免费或收费的),基本不需要学习,几天即可. 但模块开发和皮肤制作的学习曲线是比 ...

  10. Java技术分享:SpringBoot多模块开发

    在Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,常见的就是分为model(域模型层).dao(数据库访问层).service(业务逻辑层).controller(控制器层).we ...

最新文章

  1. 2021年大数据Hive(五):Hive的内置函数(数学、字符串、日期、条件、转换、行转列)
  2. win10系统上安装cmder并实现右键启动
  3. oracle10 exp imp 中文乱码
  4. JAVA数据类型与逻辑练习
  5. php知识点_PHP那些琐碎的知识点(整理)
  6. 打印两个有序链表的公共部分~~
  7. 面试官:备战年终,这些面试考点,请你牢牢记住
  8. CSS 魔法系列:纯 CSS 绘制各种图形《系列五》
  9. python的重点和难点_python知识点汇总-Go语言中文社区
  10. 终端进入网页_华为云进入IDC MarketScape终端安全检测与响应市场领导者象限
  11. 【Numpy基础】矩阵数组相乘与神经网络的实现
  12. 【动态规划】最大子段和问题,最大子矩阵和问题,最大m子段和问题
  13. Python爬虫实战:css加密 动态字体练习 猿人学比赛题目七题详解
  14. Linux 文本处理工具——sed
  15. PXE+Kickstart 无人值守安装系统
  16. 《程序员的创世传说》第三节 魔王与2012
  17. MyBatis基于XML的使用——缓存
  18. android模拟器bo,在 Android 模拟器中安装 busybox
  19. 计算机能力用英语介绍自己的家庭,介绍我的家庭英语作文(精选10篇)
  20. 计算机中录音文件以什么格式保存,手机录音是什么格式

热门文章

  1. PCL中3D点云特征描述与提取(二)
  2. latex编译报错:Font ntx-Regular- tlf-ot1r at 438 not found
  3. 随笔(一)—2018-1-23-ANU暑期学校-无题
  4. 融合泊车占比超过60%,除了德赛西威,还有哪些本土供应商
  5. uni-app 实现搜索关键词高亮效果
  6. 域名dns污染,如何防治?
  7. 国家一级职业资格证书 计算机类有哪些
  8. (六)CRAFT----2019CVPR论文解读
  9. 【C】【吐血整理】你们要的C语言实例大全-综合应用篇
  10. lisp实心圆点怎么画_cad中怎么样画实心圆点