使用串口读取写入FX3UPLC数据

By cuiqbo at 2020-12-30 • 0人收藏 • 1877人看过

大神看看那些放需要优化的

import console; 

//获取FXPLC,寄存器地址
var RWAddr = function(address){
    var addr;
 	var str = string.match(address,"\a");
 	var fnc;
 	//读取地址定义
   	select(str) {
  		case "X" { addr = 0x0080; fnc=1;}
    	case "Y" { addr = 0x00a0; fnc=1;}
    	case "S" { addr = 0x0000; fnc=2;}
    	case "M" { addr = 0x0100; fnc=2;}
    	case "C" { addr = 0x01C0; fnc=2;}
    	case "T" { addr = 0x00C0; fnc=2;}
    	case "D" { addr = 0x1000; fnc=3;}
    	else {return error("地址错误!");}
    }
    
    select(fnc) {
    	case 1 { 
         	if(string.find(address,"[89]") )error("地址错误!");
         	var a = eval(string.replace(address,"\a","8#") ;
             	return string.format("%04x",addr + a/8);
    	}
    	case 2 { return string.format("%04x",addr + tonumber(string.match(address,"\d+")/8,16));}
    	case 3 { return string.format("%4x",addr + tonumber(string.match(address,"\d+")*2,16));}
     }
     
}

//强制FXPLC,定时器,计数器,中间继电器等地址
var QZAddr = function(address){
    var addr,s;
 	var str = string.match(Addr,"\a");
 	var fnc;
 	
	select(str) {
   		 case "X" { addr = 0x400; fnc=1;}
   		 case "Y" { addr = 0x500; fnc=1;}
   		 case "S" { addr = 0x000; fnc=2;}
    	 case "M" { addr = 0x800; fnc=2;}
   		 case "C" { addr = 0x0C0; fnc=2;}
   		 case "T" { addr = 0x600; fnc=2;}
   		 else {return error("地址错误!");}
     }
     
   	select(fnc) {
    	case 1 { 
        	 if(string.find(address,"[89]") )error("地址错误!");
            	 s = string.format("%04x",addr + eval(string.replace(address,"\a","8#")));
   		 }
  	   case 2 {  
     			s = string.format("%04x",addr + string.match(address,"\d+"));
   		 }
     }
    return string.format("%04x",string.right(s,2)++string.left(s,2)); 
}
 
var cmdStr =  class {
      
	cmdHead = 2;//命令起始位
	cmdEnd = 3;//结束位
	cmdRead = 30;//读取PLC
	cmdWrite = 31;//写入PLC数据
	cmdON = 37;//强制ON
	cmdOFF = 38;//强制OFF
}



//整理命令数据
var sendFNC = function(cmdfun,address,len=0,text){
    
	var sum1=0;
	var addr = string.upper(adr);
	var s;

	if(len>0){
 		addr =  addr ++  string.format("%02d", len); 
	}

	for(i=1;#addr;1){
		sum1 += addr[i]
	}

	sum1 += 0x3 + tostring("0x"++cmdfun);
	if(text){
		
   		var a = string.format("%04x",text )
		var b = string.right(a,2)++string.left(a,2);
		for(i=1;#a;1){
			sum1 += string.hex(a[i]);
		}
		
		crcSum = string.upper(string.right(string.format("%x", sum1),2))
		s = b++crcSum;
		
	}else {
    crcSum = string.upper(string.right(string.format("%x", sum1),2))
    s =crcSum;
	}
	
	return  string.format("%02d %d%s %02d%s", 0x02,cmdfun,string.hex(addr," "),0x03,string.hex(s," "))
}

//高低位转换
var trHL = function(ad,data){
    
	var str =string.sub(data,2,#Data-3);
	var pattern =  "[\dA-F]{4,4}";
	var tab ={};
	var num = string.match(ad,"\d+") 
	//console.log(string.match(ad,"\d+") )

	for s in string.gmatch( str, pattern ){
		var d ="D";
		d=d ++num;
		tab[d] = string.right(s,2)++string.left(s,2);
		num++;
	}
	
	return tab; 
}

//读写高低位
 var tranRW =function(reg,str,len=1){
     var r =string.upper(reg);
     
 	if(string.find(r,"[SMTC]") && eval(len)=1) return tonumber("0x"++string.sub(str,2,#str-3)) & 2**(tonumber(r)%8) ? "on":"off";
	
	if(string.find(r,"[XY]") && eval(len)=1) return tonumber("0x"++string.sub(str,2,#str-3)) & 2**tonumber(string.right(r,1)) ? "on":"off";
   
    if(string.find(r,"D")) return trHL(r,str);
 }
 
var readReg =function(address ,len){
    
}

//写入D或置位STMXY weriteReg("D0",10) 暂时只能写一个地址
var writeReg = function(address ,s){
    var cmd;
    var len =0;
	var a = string.upper(address);
	if(string.find(a,"[XYCDSMT]"){ 
		var s1 = string.upper(s?"on":"off");
		select(s1) {
			case "ON" { cmd = 37;}
			case "OFF"{ cmd = 38;}
		else {error("参数2错误!")}
		}
 
	}else {
		
		if(string.match(s,"[\dA-F]"){ 
		
			cmd = 31; len =2;
		
		}else { 
		
		return  error("参数2错误");
		
		}
 
	}
	
	return len>0 ? sendFNC(cmd,RWAddr(address),len,s) : sendFNC(cmd,QZAddr(address),len,s);
}  

import sio;

var sport = sio.port("COM5");
var cmdPlc = cmdStr();

//设置串口(波特率,数据位,停止位,校验位)
sport.ioctl(9600,7,1,"even");
sport.writeHex(sendFNC(cmdPlc.cmdRead,RWAddr("D10"),6));

sleep(100);
var revcread = sport.read()
var tab = tranRW("D10",revcread)

for(k,v in tab){
console.log(k,"0x"++ v)
}

console.pause(true);


6 个回复 | 最后更新于 2021-03-24
2020-12-30   #1

先点赞



2020-12-30   #2

赞一个

2020-12-30   #3

回复#2 @admin :这个是三菱FX系列PLC编程口通讯控制的代码

2020-12-31   #4
2021-01-01   #5

回复#4 @jacen_he :

谢谢作者指出,代码写的不规范的问题。

2021-03-24   #6

说到代码规范,没有老哥能给vscode弄一个写aardiro代码的插件。vscode有好多用惯的插件,换aardio写不顺手了。

扩展里的aar-vsocde 和 aardio 都不得劲。

PS:真不是我伸手党的问题,我确实太菜了。

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...