aardio调用HslCommunication.dll实现工业自动化通信研究学习

By 笑口常 at 2021-07-24 • 1人收藏 • 635人看过

HslCommunication 专注于底层的技术通信及跨平台,由C#语言编写的dll类库, 可实现各种主流的PLC数据读写,实现modbus,机器人的各种协议读写等等 ,  提供统一接口 , 程序人员只需要关注读写内容即可 . 

官方网址: http://www.hslcommunication.cn

官方文档: http://api.hslcommunication.cn/html/c136d3de-eab7-9b0f-4bdf-d891297c8018.htm


HslCommunication.zip

目前支持多家设备和仪器,列表如下:

image.png


8 个回复 | 最后更新于 4 天前
2021-07-24   #1

日志的读写测试:

image.png

//调用C#程序集 
import dotNet; 
var appDomain = dotNet.clr().createAppDomain();
//加载应用程序目录下的程序集
var HSIdll = appDomain.loadFile("\res\HslCommunication.dll");
//声明接口
var logNet = HSIdll.new("HslCommunication.LogNet.LogNetSingle","C:\Users\Administrator\Desktop\HSICOM\aardio工程15\log\123.txt");

logNet.WriteDebug( "Debug log test" );
logNet.WriteInfo( "Info log test" );
logNet.WriteWarn( "Warn log test" );
logNet.WriteError( "Error log test" );
logNet.WriteFatal( "Fatal log test" );

// 还有下面的几种额外的情况
logNet.WriteNewLine( );                       // 追加一行空行
logNet.WriteDescrition( "test" );             // 写入额外的注释的信息
logNet.WriteAnyString( "any string" );        // 写任意的数据,不受格式化影响

// 此处的5个等级有高低之分 debug < info < warn < error < fatal < all
// 如果我们需要屏蔽debug等级的话
logNet.SetMessageDegree( HSIdll.getEnum("HslCommunication.LogNet.HslMessageDegree.INFO") );

// 如果我们需要屏蔽debug及info等级的
logNet.SetMessageDegree( HSIdll.getEnum("HslCommunication.LogNet.HslMessageDegree.WARN") );

// 带关键字的功能
logNet.WriteDebug( "A","Debug log test" );
logNet.WriteInfo( "B", "Info log test" );
logNet.WriteWarn( "C", "Warn log test" );
logNet.WriteError( "A", "Error log test" );
logNet.WriteFatal( "B", "Fatal log test" );

// 有了关键字之后,我们就可以根据关键字过滤了
logNet.FiltrateKeyword( "B" ); // 我们不需要B的关键字的日志
logNet.RemoveFiltrate( "B" );  // 重新需要B的关键字的日志


2021-07-24   #2

以三菱PLC为例子 , 其他的plc调用方式基本是一模一样的,就是调用的类不一样,参数配置不一样而已。以下的逻辑都是适用的.

很遗憾, 我这边没有PLC测试, 也没有去安装PLC虚拟机 , 如果你有的话可以测试下.


image.png

//调用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( );


2021-07-24   #3

modbus的例子:

image.png

//调用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);

image.png

来定义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);
}

image.png

2021-07-25   #4

,之前看到也看到过这个,本来想用它WinTcpS7_Smart.dll使用西门子smartPLC通讯的,有站主的这个就准备抄代码了

2021-07-26   #5

回复#4 @cuiqbo :

经过 jacenHe 老大的指点, 参数问题解决了, 参数利用com.variant包装下然后给c#即可.

之前写的csharp相关的代码也修改了下, 目前测试没问题了.

等我抽空把这个HSI写个调用库,回报aardio

2021-07-28   #6

2021-08-06   #7

期待你的库,最近也在研究HslCommunication.dll


4 天前   #8

好期待...以后工作轻松多了

登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前在学aardio+halcon机器视觉.
加入本站专享群:783804676
AARDIO语言QQ大群:70517368
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
C大Aardio论坛:Aar爱好者论坛
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
赞助商:才仁机械
下载站:
非凡软件站



Loading...