aardio调用HslCommunication.dll实现工业自动化通信研究学习
HslCommunication 专注于底层的技术通信及跨平台,由C#语言编写的dll类库, 可实现各种主流的PLC数据读写,实现modbus,机器人的各种协议读写等等 , 提供统一接口 , 程序人员只需要关注读写内容即可 .
官方网址: http://www.hslcommunication.cn
官方文档: http://api.hslcommunication.cn/html/c136d3de-eab7-9b0f-4bdf-d891297c8018.htm
目前支持多家设备和仪器,列表如下:
以三菱PLC为例子 , 其他的plc调用方式基本是一模一样的,就是调用的类不一样,参数配置不一样而已。以下的逻辑都是适用的.
很遗憾, 我这边没有PLC测试, 也没有去安装PLC虚拟机 , 如果你有的话可以测试下.
//调用C#程序集 import dotNet; var appDomain = dotNet.clr().createAppDomain(); //加载应用程序目录下的程序集 var HSIdll = appDomain.loadFile("\res\HslCommunication.dll"); //声明接口 , 地址和端口号 var melsecMc = HSIdll.new("HslCommunication.Profinet.Melsec.MelsecMcNet", "192.168.1.110", 6000); //连接服务器 var connect = melsecMc.ConnectServer( ); //判断是否成功 if (!connect.IsSuccess) { console.log( "connect failed:" + connect.Message ); }else { console.log( "connect success!"); } // 举例读取D100的值 var D100 = melsecMc.ReadInt16( "D100" ).Content; console.log("D100",D100); // 实际上所有的读写都是返回是否成功的标记的,在实际的开发中,需要严格的判定,怎么判定呢?如下的代码 var readD100 = melsecMc.ReadInt16( "D100" ); if (readD100.IsSuccess) { // 读取成功,这时候获取Content才是正确的值 var value = readD100.Content; console.log("readD100",readD100); } else { // 读取失败,如果仍然坚持去获取Content的值,就为0 } // 读写是否成功的情况,应用于几乎所有的读写代码,只要看清楚返回的数据类型即可 melsecMc.ConnectClose( );
modbus的例子:
//调用C#程序集 import dotNet; var appDomain = dotNet.clr().createAppDomain(); //加载应用程序目录下的程序集 var HSIdll = appDomain.loadFile("\res\HslCommunication.dll"); //声明接口 , 参数: 站号 var BusRtuClient = HSIdll.new("HslCommunication.ModBus.ModbusRtu",com.Variant(1,0x11/*_VT_UI1*/)); mainForm.button.oncommand = function(id,event){ BusRtuClient.SerialPortInni( "COM1",9600 ); BusRtuClient.Open( ); // 打开 } mainForm.button2.oncommand = function(id,event){ //从100寄存器读取一个int32数据 var short100 = BusRtuClient.ReadInt32("100").Content; // 读取寄存器100的short值 console.log("short100",short100); } mainForm.button3.oncommand = function(id,event){ //向寄存器100里面写入uint16类型的数据 BusRtuClient.Write("100", com.Variant((tonumber(mainForm.edit.text)),0x12/*_VT_UI2*/) );// 写入寄存器100为12345 } mainForm.button4.oncommand = function(id,event){ BusRtuClient.Close( ); }
这里需要特别注意: BusRtuClient.SerialPortInni( "COM1",9600 );其实可以有多个参数
BusRtuClient.Write("100", 123 );的第二个参数传过去后会变成 int32 , , 那么如果是其他参数类型, 那么就需要用
com.Variant(2,0x12/*_VT_UI2*/)
或者 用新版aardio的
com.Uint16(2);
来定义Uint16类型, 其他的依次类推.
数组的话, 用
com.SafeArray(3/*_VT_I4*/,12,34,56)
或者 新版aardio的 ,
com.int32({12,34,56})
来定义三个int32类型数组.
于是, 我们测试下读取两个uint16数据:
mainForm.button2.oncommand = function(id,event){ var short100 = BusRtuClient.ReadInt16("100",com.Variant(2,0x12/*_VT_UI2*/)).Content; // 读取寄存器100的short值 console.dump("short100",short100); }
using System; using System.Text; using System.Threading; using HslCommunication; using HslCommunication.MQTT; namespace MqttTestClient { class Program { static void Main(string[] args) { MyClass mc = new MyClass(); mc.Start(); mc.Connect();//连接 mc.Regist();//注册 Console.WriteLine("输入“send”发送消息"); string s = Console.ReadLine(); if (s == "send") { Console.WriteLine("我发送成功了"); mc.SendMsg(); } Console.ReadLine(); } public class MyClass { private MqttClient mqttClient = null; public void Start() { mqttClient = new MqttClient(new MqttConnectionOptions() { ClientId = "ABC", IpAddress = "127.0.0.1", Port = 6666, Credentials = new MqttCredential("admin", "admin"), // 设置了用户名和密码 }); } public void Connect() { // 连接 OperateResult connect = mqttClient.ConnectServer(); if (connect.IsSuccess) { Console.WriteLine("Success"); } else { Console.WriteLine("Failed"); } } public void SendMsg() { // 测试发布 mqttClient.PublishMessage(new MqttApplicationMessage() { Topic = "A", // 主题 QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce, // 消息等级 Payload = Encoding.UTF8.GetBytes("This is test message!"), // 数据 Retain = false, // 是否保留 }); } public void Regist() { // 订阅测试,在label1上显示结果 mqttClient.OnMqttMessageReceived += MqttClient_OnMqttMessageReceived; // 调用一次即可 mqttClient.SubscribeMessage("A"); // 订阅A的主题 } private void MqttClient_OnMqttMessageReceived(string topic, byte[] payload) { //topic是主题名字。payload是消息内容; Console.WriteLine("我收到了消息了"); string s = Encoding.UTF8.GetString(payload); Console.WriteLine(s); } } } }
这是个mqtt客户端,但是处理
mqttClient.OnMqttMessageReceived += MqttClient_OnMqttMessageReceived; // 调用一次即可
总是报错,不知道怎么写了,现在连接成功,就是不知道如何输出消息,请求高手能指点下不
import console; //调用C#程序集 import dotNet; var appDomain = dotNet.clr().createAppDomain(); //加载应用程序目录下的程序集 var HSIdll = appDomain.loadFile("\res\HslCommunication.dll"); var options= HSIdll.new("HslCommunication.MQTT.MqttConnectionOptions"); options.CleanSession = false; options.IpAddress="127.0.0.1"; options.Port=1883; options.ClientId="abc123"; var mqttClient= HSIdll.new("HslCommunication.MQTT.MqttClient",options); mqttClient.OnMqttMessageReceived = MqttClient_OnMqttMessageReceived; // 绑定事件显示总是报错 //连接服务器 var connect = mqttClient.ConnectServer(); //判断是否成功 if (!connect.IsSuccess) { console.log( "connect failed:" + connect.Message ); }else { console.log( "connect success!"); } var sub = mqttClient.SubscribeMessage( "/Pub" ); if (sub.IsSuccess) { console.log( "订阅"++ sub.Message ); } else { console.log( "connect failed:" + sub.Message ); } mqttClient.OnMqttMessageReceived=function(topic,payload) begin Console.log( "Topic:" + topic ); end; console.pause(true);
回复#11 @你又变了 :
实测可以收到, 是你自己代码写的有问题, 都说了让你删掉那句你纠结的...... , 另外回调参数有三个 .... , 为什么有三个参数你楼上自己函数原型都写出来了
import win.ui; /*DSG{{*/ var winform = win.form(text="aardio mqtt";right=354;bottom=190) winform.add() /*}}*/ import console; console.open() //调用C#程序集 import dotNet; //加载应用程序目录下的程序集 var HSIdll = dotNet.load("\HslCommunication.dll"); var options = HSIdll.new("HslCommunication.MQTT.MqttConnectionOptions"); options.CleanSession = false; options.IpAddress="127.0.0.1"; options.Port=1883; options.ClientId="abc123"; var mqttClient= HSIdll.new("HslCommunication.MQTT.MqttClient",options); //连接服务器 var connect = mqttClient.ConnectServer(); //判断是否成功 if (!connect.IsSuccess) { console.log( "connect failed:" + connect.Message ); }else { console.log( "connect success!"); } mqttClient.OnMqttMessageReceived=function(client,topic,payload){ console.log("client:",client.ToString()) console.log("topic:",topic) console.log("payload:",payload) } winform.show(); win.loopMessage();
登录后方可回帖
日志的读写测试: