一般来说,读写plc寄存器信息用于自动化产线控制及在没有上位机交互的情况下数据采集(不建议,数采效率不高)
1,在服务器上安装配置KepWare及OPC服务
2,服务器上部署一个SOS服务用于读写服务
3. 配置需PLC的IP,端口,品牌(所支持的驱动),寄存器地址。一般使用同步读写。启动opc服务,调试是否能正常读写。
4. plc方需设置,定时清除PLC寄存器地址的值为默认值(比如0)。
5.建一个表,用于记录配置
写入信号
function sendPlc(location){
sql = "select tag_arg1 from FA_PLC_CONTROL t where location = '"+location+"'"//读取表信息,获取需要写入的寄存器地址
vecResult = getArrayDataFromActive(sql)
if(glbUnNull(vecResult)){
tagName=vecResult.get(0)[0]
plcRelease(tagName)//调用发送信号函数
}
}
function plcRelease(tagName){
tagSetValue="1"
syncURL ="http://10.xx.xx.xx:8156/web?method_type=WRITE_TAG&tagName="+tagName+"&tagValue="+tagSetValue
//该ip地址即为sos服务,负责接送发送请求
strRs=class com.amaxgs.mes.plugin.httpService.CustomizationHttpClient::sendGet(syncURL)
logInfoMessage("CheckResult发送PLC信号 ===> " + syncURL)
}
此时PLC寄存器收到信号“1”,并作出相应动作。
读取信息
function readPlc(lineName){
jsonCommObj=class com.amaxgs.esb.json.jsonComm
syncURL ="http://10.xx.xx.xx:8156/web?method_type=INIT&line_name="+lineName
jsonStr = class com.amaxgs.mes.plugin.httpService.CustomizationHttpClient::sendGet(syncURL)
hashReadData = jsonCommObj::jsonObjToHash(jsonStr)
scanCode=""
for(i=0;i<hashReadData.size()-1;i++){
readCode=hex(stringToInt(hashReadData.get(lineName+"_"+i)))//数值转换
if(readCode=="0"){
return null
}
readData=readCode.substring(3,readCode.length())+readCode.substring(1,readCode.length()-2)
scanCode=scanCode+readData
}
return scanCode
}
PS:
1.每个lineName作为一组,for循环拼接转换成一个条码
详见前面配置表.
2.因PLC品牌不同,每个寄存器的可存取数据长度也不相同。
3.每个寄存器的值需要做转换,变成相应的值。
以上实例使用的是三菱品牌的plc,每个寄存器只可写入2个字节的数据。
以上如有错误,欢迎提出讨论更正。