diff --git a/Src/HslCommunication.dll b/Src/HslCommunication.dll index 7e17de7..caf5d9c 100644 Binary files a/Src/HslCommunication.dll and b/Src/HslCommunication.dll differ diff --git a/Src/HslCommunication.xml b/Src/HslCommunication.xml index d17df2a..662d60d 100644 --- a/Src/HslCommunication.xml +++ b/Src/HslCommunication.xml @@ -6768,6 +6768,9 @@ + + + 用于读写的设备接口,相较于,额外增加的一个站号信息的属性,参见
@@ -10686,7 +10689,7 @@ - 读取支持Hsl特性的数据内容,该特性为,详细参考api文档说明
+ 读取支持Hsl特性的数据内容,该特性为,详细参考api文档说明,或是官网的详细文档
Read the data content of the Hsl attribute. The attribute is , please refer to the api documentation for details.
自定义的数据类型对象 @@ -13479,6 +13482,9 @@ Gets the number of pending locks currently entered
+ + + 获取当前HslCommunication组件里正总的所有进入锁的信息
@@ -16102,6 +16108,11 @@ Length of data read
+ + + 如果关联了字符串类型的数据,则表示指定的字符编码,默认 ASCII 编码 + + 实例化一个地址特性,指定地址信息,用于单变量的数据
@@ -16118,14 +16129,21 @@ 设备的地址信息 + + + 实例化一个地址特性,指定地址信息和数据长度,通常应用于数组的批量读取
Instantiate an address feature, specify address information and data length, usually used in batch reading of arrays
真实的地址信息 读取的数据长度 + 如果是字符串类型的数据的话,就是字符串编码
+ + + 实例化一个地址特性,指定地址信息和数据长度,通常应用于数组的批量读取,并指定设备的类型,可用于不同种类的PLC
Instantiate an address feature, specify address information and data length, usually used in batch reading of arrays, @@ -16134,6 +16152,7 @@ 真实的地址信息 读取的数据长度 设备类型 + 如果是字符串类型的数据的话,就是字符串编码 @@ -16145,6 +16164,13 @@ + + + 获取当前关联的编码信息,通常用于解析字符串的操作
+ Gets the encoding information of the current association, usually used for string parsing operations +
+ 字符编码信息 +
Hsl相关地址的属性信息 @@ -16372,6 +16398,9 @@ 属性信息 设备类型信息 + + + 从设备里读取支持Hsl特性的数据内容,该特性为,详细参考论坛的操作说明。 @@ -21329,17 +21358,17 @@ 信息列表 - - 注册一个RPC的服务接口,可以指定当前的控制器名称,以及提供RPC服务的原始对象
- Register an RPC service interface, you can specify the current controller name, - and the original object that provides the RPC service -
- 前置的接口信息,可以理解为MVC模式的控制器 - 原始对象信息 +
+ + + + + + 设置登录的账户信息,如果需要自己控制,可以自己实现委托
@@ -25707,7 +25736,8 @@ - 字符串的数据是否发生反转 + 字符串的数据是否发生反转,默认为 True, 将根据高地位进行翻转操作
+ Whether the data of the string is reversed or not, the default is True, and the flip operation will be performed according to the high status
@@ -25715,7 +25745,8 @@ - 是否对客户端及主站的站号进行强制校验,只有站号匹配才进行返回数据,默认为false,对站号信息不校验操作 + 是否对客户端及主站的站号进行强制校验,只有两者站号匹配才进行返回数据,默认为false,对站号信息不校验操作
+ Whether to forcibly verify the station ids of the client and the master station. The data is returned only when the station ids of the client and master station match. The default value is false
@@ -25732,7 +25763,8 @@ - 读取DLT设备的字符串数据信息 + 根据指定的地址,读取DLT设备的字符串格式的数据信息
+ Read the DLT device data in string format based on the specified address
地址信息 包含字符串结果数组的对象 @@ -27674,9 +27706,6 @@ Get or set whether to use the secure request mode, for some meters, the safe mode is not supported, so you need to set it to False.
- - - 客户机地址CA用1字节表示, 0表示不关注客户机地址。
@@ -28903,6 +28932,15 @@ + + + 根据需要存储的日志消息,获取实际存储的字符串,重写本方法就可以自定义输出内容
+ According to the log message that needs to be stored, get the actual stored string, and the rewrite method can customize the output content +
+ 等待存储或是输出的日志对象 + 是否输出到文件里 + 最终等待存储的字符串内容 +
@@ -29908,8 +29946,11 @@ - - + + + 获取或是设置当前广播模式对应的站号,广播模式意味着不接收设备方的数据返回操作,默认为 -1,表示不使用广播模式。
+ Gets or sets the station number corresponding to the current broadcast mode. Broadcast mode means that the data return operation of the device is not received. The default value is -1, indicating that broadcast mode is not used. +
@@ -30550,6 +30591,9 @@ + + + 获取或设置当前是否启用站号检查的功能,默认启用,读写数据时将进行站号确认操作,如果需要忽略站号,则设置为 false 即可。
@@ -30587,6 +30631,9 @@ and received The data is also only modbus core messages, for example: 01 03 02 00 00, CRC has been successfully checked and removed, so you need to pay attention when parsing. + + + @@ -30770,6 +30817,9 @@ + + + @@ -30782,6 +30832,12 @@ + + + + + + @@ -31193,6 +31249,9 @@ + + + 获取modbus协议自增的消息号,你可以自定义modbus的消息号的规则,详细参见说明,也可以查找说明。
@@ -32014,6 +32073,12 @@ Get all Topic information that the current client object has subscribed to
+ + + 获取或设置当前客户端关联的自定义的对象内容
+ Gets or sets the custom object content associated with the current client +
+
@@ -33379,28 +33444,37 @@ 注册一个RPC的服务接口,可以指定当前的控制器名称,以及提供RPC服务的原始对象,指定统一的权限控制。
- Register an RPC service interface, you can specify the current controller name, - and the original object that provides the RPC service, Specify unified access control + Register an RPC service interface, you can specify the current controller name, and the original object that provides the RPC service, Specify unified access control
如果设置了的参数信息,那么请确保调用时获取了企业商业授权的权限,否则,只能使用24小时,然后因为权限问题报错。 前置的接口信息,可以理解为MVC模式的控制器 - 原始对象信息 + 原始对象信息,也可以是类型对象本身 统一的权限访问配置,将会覆盖单个方法的权限控制。
注册一个RPC的服务接口,可以指定当前的控制器名称,以及提供RPC服务的原始对象
- Register an RPC service interface, you can specify the current controller name, - and the original object that provides the RPC service + Register an RPC service interface, you can specify the current controller name, and the original object that provides the RPC service
前置的接口信息,可以理解为MVC模式的控制器 - 原始对象信息 + 原始对象信息,也可以是类型对象本身
+ + + 卸载一个已经注册的RPC接口,想要卸载指定的接口,此处就需要传入注册时一样的参数
+ Uninstall a registered RPC interface. If you want to uninstall the specified interface, you need to pass in the same parameters as the registration +
+ 前置的接口信息,可以理解为MVC模式的控制器 + 原始对象信息,也可以是类型对象本身 +
+ + + 启动文件服务功能,协议头为FILE,需要指定服务器存储的文件路径
@@ -33610,7 +33684,7 @@ 当前的MQTT的会话内容 客户端的id 用户名 - 密码 + 密码 0则是通过,否则,就是连接失败 @@ -37140,6 +37214,34 @@ 本软件已经申请软件著作权,软著登记号:2020SR0340826,任何盗用软件,破解软件,未经正式合同授权而商业使用均视为侵权。 + + + FujiSPBServer: DataFormat属性值修改为和客户端一致,DEMO界面上可以调整该值,修复英文界面下显示文本不正确的问题。 + XinJEServer: 支持输入 D,SD, HD 格式的地址,针对客户端使用XinJE专用协议的时候有效,如果用modbus协议的客户端,则还是输入modbus的地址 + SiemensS7Helper: 修复写入字符串的方法里,判断字节长度超出PLC最大设置定值时,字符串长度获取不正确的bug。 + MqttClient: 新增加一个属性 Tag, 可以用来携带任意的自定义对象,方便客户端做一些个性化的处理。 + Melsec: 三菱MC协议增加错误码17165的错误描述及解决办法,解决办法是将用户认证功能设置为禁用。 + LogNet: 日志类方法HslMessageFormat修改为虚方法,重写这个方法即可以实现存储时自定义的格式,DEMO界面在英文模式下显示英文,显示按钮的代码。 + MQTTServer: 新增方法UnRegisterMqttRpcApi用于卸载当前已经注册的指定接口,方便用于动态控制接口,此处的卸载是批量的。 + HttpServer: 新增方法UnRegisterHttpRpcApi用于卸载当前已经注册的某些接口,重复注册的时候将会覆盖旧的接口内容。 + SimpleHybirdLock: 新增进入锁的时间,当获取锁对象字符串的时候,输出当前锁的状态以及占用锁的时间。 + MqttServer: 修复ClientVerification事件签名里密码单词拼写不正确的bug。 + OmronFinsServer: 欧姆龙的FINS虚拟服务器支持了客户端使用 E9 这种地址的数据读写操作,不过所有的EM地址,E地址都使用同一个数据块。 + SecsServer: Secs服务器日志记录改为直接记录原始二进制的报文,修复服务器创建中文字符串格式的SecsValue时,长度显示不正确的bug。 + DLT645Server: 修复当StationMatch属性为true时,无论站号是否匹配都返回的bug,现在只有站号一直才支持读写数据操作。 + HslDeviceAddressAttribute: 新增字符串编码的属性,当类型是字符串有效,支持字符串数组,修复长度为0时应用于西门子读取字符串时读取字符串不正确的bug。 + Inovance: 汇川的PLC在AM系列下,读取MB1005单数地址的字符串时,也支持进行读取操作。 + IModbus: 所有Modbus设备新增属性BroadcastStation,设置0-255后,使用该站号时将不检测返回的报文,直接返回成功,ModbusServer适配站号0不返回数据。 + OmronFinsUdp: 属性SID信息不再进行自增操作,将由用户手动设置,然后demo界面支持手动设置操作。 + Demo: 批量读取的界面,新增是否字反转操作,方便部分的PLC可以看到一些特殊的数据情况。 + Demo: Secs服务器英文界面优化,西门子Smart200测试界面增加随机写入测试,并直接输出示例代码。 + Demo: MQTT测试界面增加正则过滤功能。设备类的测试界面添加数据模拟的功能,可以写入一些脚本实现的规律数据。 + Demo: HttpClient测试界面的ContentType修改为可输入。Secs界面修复英文环境下,标签名称不正确的问题 + Demo: 设备测试界面的读取功能,支持勾选屏蔽重复的值,只有数据变化的时候,才在读取界面里显示,重复就显示重复次数,菜单调试下新增设置显示毫秒时间的功能。 + 新官网:http://www.hsltechnology.cn/,还有全新的使用文档的地址:http://www.hsltechnology.cn/Doc/HslCommunication + 本软件已经申请软件著作权,软著登记号:2020SR0340826,任何盗用软件,破解软件,未经正式合同授权而商业使用均视为侵权。 + + @@ -42775,6 +42877,12 @@ + + + + + + @@ -42821,6 +42929,12 @@ + + + + + + @@ -42899,6 +43013,12 @@ + + + + + + @@ -45301,9 +45421,6 @@ 当前是否读写bool操作 解析后的数据信息 - - - 当前的MC协议的格式类型
@@ -60012,7 +60129,9 @@ SECS数据的对象信息,可以用来表示层级及嵌套的数据内容,如果需要显示,只需要 方法即可, - 如果需要发送SECS设备,只需要 ,并支持反序列化操作 ,无论是XML元素还是byte[]类型。 + 如果需要发送SECS设备,只需要 ,并支持反序列化操作 ,无论是XML元素还是byte[]类型。
+ SECS data object information, can be used to represent the hierarchy and nested data content, if you need to display, just need to method can be. + If you need to send SECS equipment, only need , and support the deserialization operation . Whether it's an XML element or byte[] type.
XML序列化,反序列化例子:
@@ -60157,11 +60276,16 @@ 数据值信息
+ + + - 通过指定的参数信息来实例化一个对象 + 通过指定的参数类型及值信息,来实例化一个对象
+ Instantiate an object by specifying the parameter type and value information
数据的类型信息 数据值信息,当是类型时,本值为空 + 长度参数信息
diff --git a/Src/HslControls.dll b/Src/HslControls.dll index 090fddd..22570d3 100644 Binary files a/Src/HslControls.dll and b/Src/HslControls.dll differ diff --git a/Tool/DataTypeEnum.cs b/Tool/DataTypeEnum.cs new file mode 100644 index 0000000..cf22144 --- /dev/null +++ b/Tool/DataTypeEnum.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tool +{ + /// + /// 数据类型 + /// + public enum DataTypeEnum + { + /// + /// 未定义 + /// + [Description("未定义")] + None = 0, + /// + /// Bool + /// + [Description("Bool")] + Bool = 1, + /// + /// Byte + /// + [Description("Byte")] + Byte = 2, + /// + /// Int16 + /// + [Description("Int16")] + Int16 = 3, + /// + /// UInt16 + /// + [Description("UInt16")] + UInt16 = 4, + /// + /// Int32 + /// + [Description("Int32")] + Int32 = 5, + /// + /// UInt32 + /// + [Description("UInt32")] + UInt32 = 6, + /// + /// Int64 + /// + [Description("Int64")] + Int64 = 7, + /// + /// UInt64 + /// + [Description("UInt64")] + UInt64 = 8, + /// + /// Float + /// + [Description("Float")] + Float = 9, + /// + /// Double + /// + [Description("Double")] + Double = 10, + /// + /// String + /// + [Description("String")] + String = 11, + } +} diff --git a/Tool/PlcConnect.cs b/Tool/PlcConnect.cs index e043d8f..7374cbb 100644 --- a/Tool/PlcConnect.cs +++ b/Tool/PlcConnect.cs @@ -1,4 +1,5 @@ using System; +using System.Management.Instrumentation; using HslCommunication; using HslCommunication.LogNet; @@ -10,6 +11,7 @@ namespace Tool { public class PlcConnect { + private static ILogNet logNet = ILogNetFactory.GetLogNet; private static readonly Lazy lazy = new Lazy(() => new PlcConnect().CreateAb()); public static AllenBradleyNet Instance => lazy.Value; private PlcConnect() @@ -39,11 +41,70 @@ namespace Tool + public OperateResult Write(string db, string value) { return Instance.Write(db, value); } + + + + + /// + /// 写入数据 + /// + /// 地址 + /// 值 + /// 数据类型 + /// + public static OperateResult Write(string address, object value, DataTypeEnum type) + { + var result = new OperateResult() { IsSuccess = false }; + switch (type) + { + case DataTypeEnum.Bool: + result= Instance.Write(address, Convert.ToBoolean(value)); + break; + case DataTypeEnum.Byte: + result = Instance.Write(address, Convert.ToByte(value)); + break; + case DataTypeEnum.Int16: + result = Instance.Write(address, Convert.ToInt16(value)); + break; + case DataTypeEnum.UInt16: + result = Instance.Write(address, Convert.ToUInt16(value)); + break; + case DataTypeEnum.Int32: + result = Instance.Write(address, Convert.ToInt32(value)); + + break; + case DataTypeEnum.UInt32: + result = Instance.Write(address, Convert.ToUInt32(value)); + break; + case DataTypeEnum.Int64: + result = Instance.Write(address, Convert.ToInt64(value)); + break; + case DataTypeEnum.UInt64: + result = Instance.Write(address, Convert.ToUInt64(value)); + break; + case DataTypeEnum.Float: + result = Instance.Write(address, Convert.ToSingle(value)); + break; + case DataTypeEnum.Double: + result = Instance.Write(address, Convert.ToDouble(value)); + break; + } + + logNet.WriteInfo("打印日志",$"write 地址[{address}] value:[{value.ToString()}] type:[{type.ToString()}] result:[{result.ToJsonString()}]"); + + return result; + } + + + } + + } diff --git a/Tool/Result.cs b/Tool/Result.cs new file mode 100644 index 0000000..6a27d80 --- /dev/null +++ b/Tool/Result.cs @@ -0,0 +1,194 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tool +{ + /// + /// 请求结果 + /// + public class Result + { + public Result() + { + } + + /// + /// 是否成功 + /// + public bool IsSucceed { get; set; } = true; + + private string _Err; + /// + /// 异常消息 + /// + public string Err + { + get + { + return _Err; + } + set + { + _Err = value; + AddErr2List(); + } + } + + /// + /// 异常Code + /// 408 连接失败 + /// + public int ErrCode { get; set; } + + /// + /// 详细异常 + /// + public Exception Exception { get; set; } + + /// + /// 异常集合 + /// + public List ErrList { get; private set; } = new List(); + + /// + /// 请求报文 + /// + public string Requst { get; set; } + + /// + /// 响应报文 + /// + public string Response { get; set; } + + /// + /// 请求报文2 + /// + public string Requst2 { get; set; } + + /// + /// 响应报文2 + /// + public string Response2 { get; set; } + + /// + /// 耗时(毫秒) + /// + public double? TimeConsuming { get; private set; } + + /// + /// 结束时间统计 + /// + internal Result EndTime() + { + TimeConsuming = (DateTime.Now - InitialTime).TotalMilliseconds; + return this; + } + + /// + /// 开始时间 + /// + public DateTime InitialTime { get; protected set; } = DateTime.Now; + + /// + /// 设置异常信息和Succeed状态 + /// + /// + /// + public Result SetErrInfo(Result result) + { + IsSucceed = result.IsSucceed; + Err = result.Err; + ErrCode = result.ErrCode; + Exception = result.Exception; + foreach (var err in result.ErrList) + { + if (!ErrList.Contains(err)) + ErrList.Add(err); + } + return this; + } + + /// + /// 添加异常到异常集合 + /// + public void AddErr2List() + { + if (!ErrList.Contains(Err)) + ErrList.Add(Err); + } + } + + /// + /// 请求结果 + /// + public class Result : Result + { + public Result() + { + } + + public Result(T data) + { + Value = data; + } + + public Result(Result result) + { + Assignment(result); + } + + public Result(Result result, T data) + { + Assignment(result); + Value = data; + } + + /// + /// 数据结果 + /// + public T Value { get; set; } + + /// + /// 结束时间统计 + /// + internal new Result EndTime() + { + base.EndTime(); + return this; + } + + /// + /// 赋值 + /// + private void Assignment(Result result) + { + IsSucceed = result.IsSucceed; + InitialTime = result.InitialTime; + Err = result.Err; + Requst = result.Requst; + Response = result.Response; + Exception = result.Exception; + ErrCode = result.ErrCode; + base.EndTime(); + foreach (var err in result.ErrList) + { + if (!ErrList.Contains(err)) + ErrList.Add(err); + } + } + + /// + /// 设置异常信息和Succeed状态 + /// + /// + /// + public new Result SetErrInfo(Result result) + { + base.SetErrInfo(result); + return this; + } + } +} diff --git a/Tool/Tool.csproj b/Tool/Tool.csproj index b6de42e..33213f4 100644 --- a/Tool/Tool.csproj +++ b/Tool/Tool.csproj @@ -62,9 +62,11 @@ + +