dll调用学习----modbusRTU.dll

By cuiqbo at 28 天前 • 0人收藏 • 333人看过

把几个功能都更新完成了有的方法写的不好,请大神指出



使用工具 

先使用VSPD设备创建虚拟串口

image.png

modbus虚拟设备软件


image.png

虚拟设备配置表

image.png

可以设备配置表导入到虚拟设备


 


使用aardio调用modbusRTU.dll代码如下


import console;
var dll = raw.loadDll($"\ModbusRTU.dll")
RTUOpenCom= dll.api("RTUOpenCom","bool(int nPort, INT dwBaud = 9600, BYTE nDataBits = 8, BYTE parity = 0, BYTE stopBits = 0)");
RTUCloseCom= dll.api("RTUCloseCom","void()");

RTUReadCoils= dll.api("RTUReadCoils","WORD(BYTE nSlaveAddress, WORD nUnitAddress, WORD nUnitCount, string& pReturnBuf)");
RTUReadDiscreteInputs= dll.api("RTUReadDiscreteInputs","WORD(BYTE nSlaveAddress, WORD nUnitAddress, WORD nUnitCount, string& pReturnBuf)");
RTUReadHoldingRegisters= dll.api("RTUReadHoldingRegisters","WORD(BYTE nSlaveAddress, WORD nRegAddress, WORD nRegCount, string& pReturnBuf)");
RTUReadInputRegisters= dll.api("RTUReadInputRegisters","WORD(BYTE nSlaveAddress, WORD nRegAddress, WORD nRegCount, string& pReturnBuf)");
RTUWriteSingleCoil= dll.api("RTUWriteSingleCoil","WORD(BYTE nSlaveAddress, WORD nRegAddress, WORD nUnitValue)");
RTUWriteMultipleCoils= dll.api("RTUWriteMultipleCoils","WORD(BYTE nSlaveAddress, WORD nRegAddress, WORD nUnitCount, string& pWriteBuf)");
RTUWriteSingleRegister= dll.api("RTUWriteSingleRegister","WORD(BYTE nSlaveAddress, WORD nRegAddress, WORD nUnitValue)");
RTUWriteMultipleRegisters= dll.api("RTUWriteMultipleRegisters","WORD(BYTE nSlaveAddress, WORD nRegAddress, WORD nUnitCount, string& pWriteBuf)");



MesErr = function(s,a){
    
	select(s) {
		case 0xffff {
			var sa ="" 	for(i=1;#a;2){	var now = string.slice(a,i,i+1);  sa = sa ++ string.hex(now,"") ;} return sa;}
		case 0x8002, 0x4002  {return "寄存器地址错误"; }
		case 0x8001  {return "返回数据错误"; }
		case 0x2001 {return "modbus地址位错误:1~247"; }
		case 0x4007 {return "modbus设备不存在"; }
		case 0x4006 {return "写入数据出错"; }
		//case 0x4005 {return "写入数据出错"; }
		case 0x4004 {return "modbus设备不存在"; }
		case 0x4003 {return "写入数据出错"; }
		case 0x4001 {return "crc错误"; }
		else {	return "ErrCode:"++s; }
	}
}

//a="0";
 ReadCoils = function(SAddr,UAddr,Count){
 
  
     var c = Count/8 > 1 ? (Count-Count%8)/8: 1;
     c = Count%8 > 0 ? c + 1 : c;
	var s,a = RTUReadCoils(SAddr,UAddr,Count,raw.buffer(c))
	return  MesErr(s,a);
}

 ReadHoldingRegisters = function(SAddr,UAddr,Count){
	var s,a = RTUReadHoldingRegisters(SAddr,UAddr,Count,raw.buffer(Count*2))
	return  MesErr(s,a);
}

ReadInputRegisters = function(SAddr,UAddr,Count){
	var s,a = RTUReadInputRegisters(SAddr,UAddr,Count,raw.buffer(Count*2))
	//console.dump(s,string.hex(a))
	return  MesErr(s,a);
}
/*打开串口 停止位 0代表1个停止位
{ [0]=1;[1]=1.5;[2]=2}
写aardio函数要转换


*/
openCom = function(Port,Baud,DataBits,parity,stopBits){
    
    stopBit = {["1"] = 0; ["1.5"] = 1; ["2"] = 2; } 
	return RTUOpenCom(Port,Baud,DataBits,parity,stopBit[tostring(stopBits)]) ; 
}

closeCom = function(){
   RTUCloseCom(); 
}

ReadDiscreteInputs = function(SAddr,UAddr,Count){
 
     var c = Count/8 > 1 ? (Count-Count%8)/8: 1;
     c = Count%8 > 0 ? c + 1 : c;
	var s,a = RTUReadDiscreteInputs(SAddr,UAddr,Count,raw.buffer(c))
	return  MesErr(s,a);
}

WriteSingleCoil =function(SAddr,UAddr,Value){
    
    var val =  Value > 0 ? 0xff00 : 0;
	return RTUWriteSingleCoil(SAddr,UAddr,val)==0xffff? true: false; 
}

WriteSingleRegister =function(SAddr,UAddr,Value){
    
    var val = string.format("%04x", Value)
	return RTUWriteSingleRegister(SAddr,UAddr,val)==0xffff? true: false; 
}


WriteMultipleCoils =function(SAddr,UAddr,Count,Value){
    
     var sendStr="";
     var c = Count/8 > 1 ? (Count-Count%8)/8: 1;
         c = Count%8 > 0 ? c + 1 : c;
      
		Value :=  0 ;
		Value = type(Value)==type.string ?Value : string.format("%02x",Value );	
	if(#Value != c*2) return 1; 
	for(i=1;#Value;2){	var now = string.slice(Value,i,i+1);  sendStr = sendStr ++ string.unhex(now," ") ;}
	
   	return RTUWriteMultipleCoils(SAddr,UAddr,Count,raw.buffer(sendStr))==0xffff? true: false; 
}

WriteMultipleRegisters =function(SAddr,UAddr,Count,Value){
    
	var sendStr="";
	Value :=  0 ;
	Value = type(Value)==type.string ?Value : string.format("%04x",Value );	
	if(#Value != Count*4) return 1; 	
	for(i=1;#Value;2){	var now = string.slice(Value,i,i+1);  sendStr = sendStr ++ string.unhex(now," ") ;}
	
   	return RTUWriteMultipleRegisters(SAddr,UAddr,Count,raw.buffer(sendStr))==0xffff? true: false; 
}




console.dump(openCom(15,9600,8,0,1))

var s=ReadInputRegisters(1,0,5);


console.dump(s)	
console.dump( ReadCoils(1,0,16))
console.dump(WriteSingleCoil(1,0,1))
console.dump(WriteSingleRegister(1,0,4))
console.dump(WriteMultipleCoils(1,0,16,"da24"))

console.dump(WriteMultipleRegisters(1,0,2,"da24"))
closeCom();

console.pause("")

image.pngimage.pngimage.png


读取和写入功能 控制台显示及串口监控助手显示内容

image.png

image.png

1618580320627024.zip


raw库的一些功能还需要学习怎么用?

3 个回复 | 最后更新于 28 天前
28 天前   #1

 谢谢分享.

声明dll的时候貌似不能带初始化参数吧

RTUOpenCom= dll.api("RTUOpenCom","bool(int nPort, INT dwBaud, BYTE nDataBits, BYTE parity, BYTE stopBits)");


28 天前   #2

带了也没有用忘记删除了

28 天前   #3
//modbusRTU自定义通信库
namespace com.comm.modbus;
modbusRTU = class {
    ctor( /*输入构造函数所需要的参数*/ ){
    
    };
  
MesErr = function(s,a){
    
select(s) {
case 0xffff {
var sa ="" for(i=1;#a;2){var now = string.slice(a,i,i+1);  sa = sa ++ string.hex(now,"") ;} return sa;}
case 0x8002, 0x4002  {return "寄存器地址错误"; }
case 0x8001  {return "返回数据错误"; }
case 0x2001 {return "modbus地址位错误:1~247"; }
case 0x4007 {return "modbus设备不存在"; }
case 0x4006 {return "写入数据出错"; }
//case 0x4005 {return "写入数据出错"; }
case 0x4004 {return "modbus设备不存在"; }
case 0x4003 {return "写入数据出错"; }
case 0x4001 {return "crc错误"; }
else {return "ErrCode:"++s; }
}
};
 ReadCoils = function(SAddr,UAddr,Count){
 
  
     var c = Count/8 > 1 ? (Count-Count%8)/8: 1;
     c = Count%8 > 0 ? c + 1 : c;
var s,a = RTUReadCoils(SAddr,UAddr,Count,..raw.buffer(c))
return  MesErr(s,a);
};
 ReadHoldingRegisters = function(SAddr,UAddr,Count){
var s,a = RTUReadHoldingRegisters(SAddr,UAddr,Count,..raw.buffer(Count*2))
return  MesErr(s,a);
};
ReadInputRegisters = function(SAddr,UAddr,Count){
var s,a = RTUReadInputRegisters(SAddr,UAddr,Count,..raw.buffer(Count*2))
return  MesErr(s,a);
};
openCom = function(Port,Baud,DataBits,parity,stopBits){
    
    stopBit = {["1"] = 0; ["1.5"] = 1; ["2"] = 2; } 
return RTUOpenCom(Port,Baud,DataBits,parity,stopBit[tostring(stopBits)]) ; 
};
closeCom = function(){
   RTUCloseCom(); 
};
ReadDiscreteInputs = function(SAddr,UAddr,Count){
 
     var c = Count/8 > 1 ? (Count-Count%8)/8: 1;
     c = Count%8 > 0 ? c + 1 : c;
var s,a = RTUReadDiscreteInputs(SAddr,UAddr,Count,..raw.buffer(c))
return  MesErr(s,a);
}
WriteSingleCoil =function(SAddr,UAddr,Value){
    
    var val =  Value > 0 ? 0xff00 : 0;
return RTUWriteSingleCoil(SAddr,UAddr,val)==0xffff? true: false; 
};
WriteSingleRegister =function(SAddr,UAddr,Value){
    
    var val = string.format("%04x", Value)
return RTUWriteSingleRegister(SAddr,UAddr,val)==0xffff? true: false; 
};
WriteMultipleCoils =function(SAddr,UAddr,Count,Value){
    
     var sendStr="";
     var c = Count/8 > 1 ? (Count-Count%8)/8: 1;
         c = Count%8 > 0 ? c + 1 : c;
      
Value :=  0 ;
Value = type(Value)==type.string ?Value : string.format("%02x",Value );
if(#Value != c*2) return 1; 
for(i=1;#Value;2){var now = string.slice(Value,i,i+1);  sendStr = sendStr ++ string.unhex(now," ") ;}
   return RTUWriteMultipleCoils(SAddr,UAddr,Count,..raw.buffer(sendStr))==0xffff? true: false; 
};
WriteMultipleRegisters =function(SAddr,UAddr,Count,Value){
    
var sendStr="";
Value :=  0 ;
Value = type(Value)==type.string ?Value : string.format("%04x",Value );
if(#Value != Count*4) return 1; 
for(i=1;#Value;2){var now = string.slice(Value,i,i+1);  sendStr = sendStr ++ string.unhex(now," ") ;}
   return RTUWriteMultipleRegisters(SAddr,UAddr,Count,..raw.buffer(sendStr))==0xffff? true: false; 
};
  
}
namespace modbusRTU{
    
    var dll = ..raw.loadDll($"~\lib\com\comm\modbus\.res\ModbusRTU.dll")
 
   RTUOpenCom= dll.api("RTUOpenCom","bool(int nPort, INT dwBaud, BYTE nDataBits, BYTE parity, BYTE stopBits)");
RTUCloseCom= dll.api("RTUCloseCom","void()");
RTUReadCoils= dll.api("RTUReadCoils","WORD(BYTE nSlaveAddress, WORD nUnitAddress, WORD nUnitCount, string& pReturnBuf)");
RTUReadDiscreteInputs= dll.api("RTUReadDiscreteInputs","WORD(BYTE nSlaveAddress, WORD nUnitAddress, WORD nUnitCount, string& pReturnBuf)");
RTUReadHoldingRegisters= dll.api("RTUReadHoldingRegisters","WORD(BYTE nSlaveAddress, WORD nRegAddress, WORD nRegCount, string& pReturnBuf)");
RTUReadInputRegisters= dll.api("RTUReadInputRegisters","WORD(BYTE nSlaveAddress, WORD nRegAddress, WORD nRegCount, string& pReturnBuf)");
RTUWriteSingleCoil= dll.api("RTUWriteSingleCoil","WORD(BYTE nSlaveAddress, WORD nRegAddress, WORD nUnitValue)");
RTUWriteMultipleCoils= dll.api("RTUWriteMultipleCoils","WORD(BYTE nSlaveAddress, WORD nRegAddress, WORD nUnitCount, string& pWriteBuf)");
RTUWriteSingleRegister= dll.api("RTUWriteSingleRegister","WORD(BYTE nSlaveAddress, WORD nRegAddress, WORD nUnitValue)");
RTUWriteMultipleRegisters= dll.api("RTUWriteMultipleRegisters","WORD(BYTE nSlaveAddress, WORD nRegAddress, WORD nUnitCount, string& pWriteBuf)");
}
/**intellisense(com.comm.modbus)
modbusRTU() = !modbusRTU.
end intellisense**/
/**intellisense(!modbusRTU)
openCom(.(串口号,波特率,数据位,奇偶,停止位) = @__15,9600,8,0,1) /*打开串口*/
closeCom() = 关闭串口
ReadCoils(.(站点,起始地址,位数) =   @1,0,1) /*读取线圈*/
ReadDiscreteInputs(.(站点,起始地址,位数) = @1,0,1)/*离散输入*/
ReadHoldingRegisters(.(站点,起始地址,位数) = @1,0,1)/*保持寄存器*/
ReadInputRegisters(.(站点,起始地址,位数) = @1,0,1)/*输入寄存器*/
WriteSingleCoil(.(站点,起始地址,写入值) = @1,0,1)/*写入单个线圈,写入0代表off,1代表on*/
WriteSingleRegister(.(站点,起始地址,写入值) = @1,0,1)/*写入单个寄存器值*/
WriteMultipleCoils(.(站点,起始地址,位数,写入值) = @1,0,8,"da")/*写入多个线圈,8个线圈为1个字节*/
WriteMultipleRegisters(.(站点,起始地址,位数,写入值) = @1,0,2,"da24") /*写入多个寄存器,1个寄存器2个字节*/
end intellisense**/


登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前在学aardio+halcon机器视觉.
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
苏扬博客:苏扬博客
C大Aardio论坛:Aar爱好者论坛
简码教程网:简码编程
AARDIO语言QQ群:70517368
本 站 主 站:Stm32cube中文网
Htmlayout界面在线学习文档
Sciter中文在线文档Sciter在线学习文档
aardio在线手册Aardio在线手册

赞助商:才仁机械
下载站:非凡软件站
Loading...