【问题标题】:Read Ethernet/IP Device with Known Object Class, Assembly Instance, Attribute ID using CPPPO使用 CPPO 读取具有已知对象类、程序集实例、属性 ID 的以太网/IP 设备
【发布时间】:2021-02-24 14:14:13
【问题描述】:

从工业以太网/IP 康耐视条码扫描仪中获取基本信息时遇到了一些问题。

根据 Cognex 文档 “DataMan ID 读取器对象(类代码:0x79)” 输入程序集实例 = 11 然后显示此对象的表格,字节 14~15 = 结果数据长度with 是一个 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 和类型 UNIT。所以我尝试了 ('@0x79/11/0x17','UNIT') 但也返回了 'None'。

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

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

【问题讨论】:

    标签: python iot industrial cognex


    【解决方案1】:

    我终于弄明白了。 CIP Object 为 0x79,Instance 为 1,Attribute 为 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]

    Output Window

    【讨论】:

      【解决方案2】:

      尝试在 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 控制命令 chm 文件显示您可以使用的所有命令。 https://support.cognex.com/en/documentation/dataman/dm-260

      【讨论】:

      • 感谢您的反馈。我应该澄清一下,我真的只是想让它在 EIP 上工作,因为我已经让它在 Modbus 上工作了一段时间,但 EIP 似乎是行业向新标准的自然发展,让我可以访问更多设备,所以我试图让我知道的东西,比如这个设备通过不同的协议工作。这就是我尝试使用 cpppo 的原因
      猜你喜欢
      • 2011-01-22
      • 2020-12-17
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多