使用CPPPO读取具有已知对象类、程序集实例和属性ID的以太网/IP设备

2024-09-28 01:27:03 发布

您现在位置:Python中文网/ 问答频道 /正文

从工业以太网/IP Cognex条形码扫描仪中获取基本信息有点困难

根据Cognex文档“DataMan ID Reader对象(类代码:0x79)”输入程序集实例=11,然后显示该对象的一个表,在字节14~15=结果数据长度处为16位整数

From cpppo.server.enip.get_attribute import proxy_simple, proxy 
vendor, product_name, zz = proxy_simple( '10.202.180.90' ).read( [('@1/1/1','INT'),('@1/1/7','SSTRING'),('@0x79/11/14','UINT')] )
print(product_name)
print(vendor)
print(zz)

>>>['DataMan DM262 Reader']
>>>[678]
>>>None

我得到了产品名称、供应商编号,但无法让它返回任何结果数据长度。文档中的另一个表说明了相同数据的属性ID 0X17和类型单位。所以我尝试了('@0x79/11/0x17','UNIT'),但也返回了'None'

如果有任何想法,我将不胜感激

Picture of AttributeID Table
Picture of Input Assembly
https://github.com/pjkundert/cpppo


Tags: 数据对象name文档idproductsimplereader
2条回答

我终于弄明白了。CIP对象是0x79,实例是1,属性是0x10。这给了我一个整数数组,里面有我需要的所有数据

from cpppo.server.enip.get_attribute import proxy_simple
vendor, product_name, zz = proxy_simple( '10.202.180.66' ).read( [('@1/1/1','INT'),('@1/1/7','SSTRING'),('@0x79/1/0x10','SINT')] )

print(vendor)
print(product_name)
print(zz)

[678] ['DataMan DM374'] [20, 0, 1, 0, 0, 0, 13, 0, 48, 54, 52, 48, 53, 50, 50, 55, 49, 48, 56, 50, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

Output Window

尝试在python中使用telnetlib库

from telnetlib import Telnet
import time

tn = Telnet('192.168.1.112', 23, 2)
trigger = "||>TRIGGER ON".encode('ascii') + b'\r\n'
tn.write(trigger)
time.sleep(0.1)
resultstring = tn.read_very_eager().decode('utf-8')
tn.close()

我不得不加上一个短暂的延迟,让扫描仪有时间准备好结果。从那里,您可以根据需要处理结果字符串。例如,我使用:

if resultstring == '000':
    pass
else:
    resultstring = resultstring[:-2]
print(resultstring)

由于“000”是错误的读取字符串,并且在字符串末尾添加\r\n是正确的读取

DataMan Control Commmands chm文件向您显示了所有可以使用的命令https://support.cognex.com/en/documentation/dataman/dm-260

相关问题 更多 >

    热门问题