Anybus, EthernetIP comunication with UR5 and ESAB W82
Hello all,
I am in the process of starting up a welding station in which I have a UR5e robot (Universal robots) that performs welding with an ESAB machine. The two elements are going to communicate via Ethernet/IP since the welding machine comes with the HMS anybus-ethernetIP module.
The problem is that both the robot and the machine are devices (the robot does not act as a scanner) and I must communicate via tcp/ip from the robot asynchronously. I have been able to establish a socket connection with the EIP card of the welding machine but now I need to know how to make the corresponding CIP messages to read/write the appropriate variables.
UR has urscript functions (socket_open, socket_send_byte, socket_send, etc. as shown in the image below). And I guess I need to access the parameters:
• 9-12 “Parameter Data Input Mapping Object, Class B0h”
• 9-13 “Parameter Data Output Mapping Object, Class B1h”
If anyone can give me some advice on how I can read and write these records that would be of great help.
Thanks a lot,

Data IO Objects on HMS anybus card

-
Dear Albert,
Good day.
I am having a similar issue reading welding data via esab w82, have you been able to resolve yours and how did you fix the problems if yes?
1 -
Hi Albert!
It sounds like you're working on something that's beyond the scope of what we can directly support, but I’d still be happy to offer some guidance to point you in the right direction.
If both of your devices are Ethernet/IP Adapters, you'll need an Ethernet/IP Scanner to retrieve data from them. Depending on what you're aiming to do, a PLC could be a good option—especially if you're looking to automate data exchange. Vendors like Allen Bradley (who originally developed Ethernet/IP) or any reliable PLC vendor that provides Ethernet/IP Scanners should be suitable for this.
If your goal is simply to monitor the data for testing purposes, using an Ethernet/IP Simulator or test tool for your PC could be a more straightforward option. Pyramid Solutions, for instance, offers a tool called the EIP Scan Test Tool that’s user-friendly and might be worth considering.
That said, if you're having trouble connecting to the welding machine using a standard Ethernet/IP Scanner, you'll need to contact the welding machine's support team. Even though they use HMS modules, they’ve integrated them with custom settings that we do not have access to, so this falls outside of what we can assist with. They are the best point of contact for resolving any connection issues.
Lastly, if you're setting up something like a test stand and have a PC available—and you're comfortable programming—you might want to look into vendors that offer Ethernet/IP Stacks. These come with pre-built functions that handle the Ethernet/IP functionality, which could streamline your project. Pyramid Solutions might have something there aswell.
I hope this helps! Let me know if you have any other questions or need further clarification.
Best regards,
Franziska Gültig0 -
You might wanna also take a look at the open source project Ethernet/IP Explorer that could help you disclose the necessary packets (both through Wireshark sniffs and the source itself) to handle EtherNet/IP communication. It depends on how exactly the welding and the ESAB machine's application data are set up. Both EDS file might already give you some hints.
In general, EtherNet/IP offers three basic ways for data exchange.
Class 1 connection: a TCP connection over port 44818 has to be set up and a subsequent ForwardOpen request has to be sent and responded. Then, I/O data is exchanged with minimal overhead over UDP port 2222.
Class 3 connection: set up a TCP connection and poll the I/O data accessing the right path (address) given by the device manufacturer.
UCMM (unconnected message manager) just poll the data without need for a prior TCP connection.
Here's a KB article on the Ethernet Explorer.
Hope that helps.
0 -
Thank you for your response.
As the robot SO is Polyscope linux based and is not a closed platform i can develop in java all the applications that are desired I will try to use an EthernetIP java lib. This one for the moment: https://github.com/digitalpetri/ethernet-ip
I will try to program a syncronous thread using the mapping provided by ESAB and polling the data continuosly. And try to "virtualize" a scanner in the robot side. After making this posible with a TCP/IP server i can comunicate the robot real-time with this java service in a easier way.
If this is not posible then I will try to use the explicit metod and doing the CIP messages through the java application using the classes, interfaces, attributes and so on that is explained in the HMS doc that I'm using.
Please let me know if the document is the correct one, for sure the hardware installed is correct but for my understanding the classes that i have to point are this ones.

0 -
Hi Albert,
for an explicit message I/O data exchange, you'll need to use e.g. the get_attribute_single 0x0E or the set_attribute_single 0x10 services applied periodically to the Assembly Class 04, typically instance 0x64/0x96, attribute 03.
I'm actually not sure about classes 0xB0 and 0xB1, as I'm no expert on the older Anybus-S interface cards.
You definitely need to take a look at the manual or the EDS file of your decvices.
0 -
Thank you ALK,
The EDS file is this one, I'm struggling a bit understanding the file. I cannot put files attached so i copy/pasted the raw EDS directly.
$ EZ-EDS Version 3.11 (Beta, March-29, 2012) Generated Electronic Data Sheet
[File]
DescText = "HMS Anybus-S EtherNet/IP(TM)";
CreateDate = 01-08-2002;
CreateTime = 07:02:13;
ModDate = 02-11-2015;
ModTime = 15:08:29;
Revision = 2.07;
[Device]
VendCode = 90;
VendName = "HMS Networks";
ProdType = 12;
ProdTypeStr = "Communications Adapter";
ProdCode = 14;
MajRev = 2;
MinRev = 19;
ProdName = "Anybus-S EtherNet/IP(TM)";
Catalog = "ABS";
[Device Classification]
Class1 = EtherNetIP;
[Params]
Param1 =
0, $ first field shall equal 0
,, $ path size,path
0x0000, $ descriptor
0xC7, $ data type : 16-bit Unsigned Integer
2, $ data size in bytes
"Output Size", $ name
"", $ units
"", $ help string
0,504,16, $ min, max, default data values
,,,, $ mult, dev, base, offset scaling not used
,,,, $ mult, dev, base, offset link not used
; $ decimal places not usedParam2 =
0, $ first field shall equal 0
,, $ path size,path
0x0000, $ descriptor
0xC7, $ data type : 16-bit Unsigned Integer
2, $ data size in bytes
"Input Size", $ name
"", $ units
"", $ help string
0,509,16, $ min, max, default data values
,,,, $ mult, dev, base, offset scaling not used
,,,, $ mult, dev, base, offset link not used
; $ decimal places not usedParam3 =
0, $ reserved, shall equal 0
,, $ Link Path Size, Link Path
0x0000, $ Descriptor
0xC8, $ Data Type
4, $ Data Size in bytes
"RPI Range", $ name
"", $ units
"", $ help string
2000,3200000,10000, $ min, max, default data values
,,,, $ mult, div, base, offset scaling
,,,, $ mult, div, base, offset links
; $ decimal places
[Assembly]
Revision = 2;Assem100 =
"INPUT",
,
509,
0x0000,
,,
4072,;
Assem150 =
"OUTPUT",
,
504,
0x0001,
,,
4032,;
[Connection Manager]
Connection1 =
0x04030002, $ 0-15 = supported transport classes
$ 16 = trigger: cyclic
$ 17 = trigger: change of state4
$ 18 = trigger: application
$ 19-23 = trigger: reserved
$ 24 = transport type: listen-only
$ 25 = transport type: input-only
$ 26 = transport type: exclusive-owner
$ 27 = transport type: redundant-owner
$ 28-30 = reserved
$ 31 = Client = 0 / Server = 1
0x44640405, $ 0 = O->T fixed size supported
$ 1 = O->T variable size supported
$ 2 = T->O fixed size supported
$ 3 = T->O variable size supported
$ 4-5 = O->T number of bytes per slot (obsolete)
$ 6-7 = T->O number of bytes per slot (obsolete)
$ 8-10 = O->T Real time transfer format
$ 11 = reserved
$ 12-14 = T->O Real time transfer format
$ 15 = reserved
$ 16 = O->T connection type: NULL
$ 17 = O->T connection type: MULTICAST
$ 18 = O->T connection type: POINT2POINT
$ 19 = O->T connection type: reserved
$ 20 = T->O connection type: NULL
$ 21 = T->O connection type: MULTICAST
$ 22 = T->O connection type: POINT2POINT
$ 23 = T->O connection type: reserved
$ 24 = O->T priority: LOW
$ 25 = O->T priority: HIGH
$ 26 = O->T priority: SCHEDULED
$ 27 = O->T priority: reserved
$ 28 = T->O priority: LOW
$ 29 = T->O priority: HIGH
$ 30 = T->O priority: SCHEDULED
$ 31 = T->O priority: reserved
Param3,Param1,Assem150, $ O->T RPI, size, format
Param3,Param2,Assem100, $ T->O RPI, size, format
,, $ config #1 size, format
,, $ config #2 size, format
"Exclusive Owner", $ Connection Name
"", $ help string
"20 04 24 C5 2C 96 2C 64"; $ Path
Connection2 =
0x02030002, $ 0-15 = supported transport classes
$ 16 = trigger: cyclic
$ 17 = trigger: change of state
$ 18 = trigger: application
$ 19-23 = trigger: reserved
$ 24 = transport type: listen-only
$ 25 = transport type: input-only
$ 26 = transport type: exclusive-owner
$ 27 = transport type: redundant-owner
$ 28-30 = reserved
$ 31 = Client = 0 / Server = 1
0x44640305, $ 0 = O->T fixed size supported
$ 1 = O->T variable size supported
$ 2 = T->O fixed size supported
$ 3 = T->O variable size supported
$ 4-5 = O->T number of bytes per slot (obsolete)
$ 6-7 = T->O number of bytes per slot (obsolete)
$ 8-10 = O->T Real time transfer format
$ 11 = reserved
$ 12-14 = T->O Real time transfer format
$ 15 = reserved
$ 16 = O->T connection type: NULL
$ 17 = O->T connection type: MULTICAST
$ 18 = O->T connection type: POINT2POINT
$ 19 = O->T connection type: reserved
$ 20 = T->O connection type: NULL
$ 21 = T->O connection type: MULTICAST
$ 22 = T->O connection type: POINT2POINT
$ 23 = T->O connection type: reserved
$ 24 = O->T priority: LOW
$ 25 = O->T priority: HIGH
$ 26 = O->T priority: SCHEDULED
$ 27 = O->T priority: reserved
$ 28 = T->O priority: LOW
$ 29 = T->O priority: HIGH
$ 30 = T->O priority: SCHEDULED
$ 31 = T->O priority: reserved
Param3,0,, $ O->T RPI, size, format
Param3,Param2,Assem100, $ T->O RPI, size, format
,, $ config #1 size, format
,, $ config #2 size, format
"Input Only", $ Connection Name
"", $ help string
"20 04 24 C5 2C C6 2C 64"; $ Path
Connection3 =
0x01030002, $ 0-15 = supported transport classes
$ 16 = trigger: cyclic
$ 17 = trigger: change of state
$ 18 = trigger: application
$ 19-23 = trigger: reserved
$ 24 = transport type: listen-only
$ 25 = transport type: input-only
$ 26 = transport type: exclusive-owner
$ 27 = transport type: redundant-owner
$ 28-30 = reserved
$ 31 = Client = 0 / Server = 1
0x44240305, $ 0 = O->T fixed size supported
$ 1 = O->T variable size supported
$ 2 = T->O fixed size supported
$ 3 = T->O variable size supported
$ 4-5 = O->T number of bytes per slot (obsolete)
$ 6-7 = T->O number of bytes per slot (obsolete)
$ 8-10 = O->T Real time transfer format
$ 11 = reserved
$ 12-14 = T->O Real time transfer format
$ 15 = reserved
$ 16 = O->T connection type: NULL
$ 17 = O->T connection type: MULTICAST
$ 18 = O->T connection type: POINT2POINT
$ 19 = O->T connection type: reserved
$ 20 = T->O connection type: NULL
$ 21 = T->O connection type: MULTICAST
$ 22 = T->O connection type: POINT2POINT
$ 23 = T->O connection type: reserved
$ 24 = O->T priority: LOW
$ 25 = O->T priority: HIGH
$ 26 = O->T priority: SCHEDULED
$ 27 = O->T priority: reserved
$ 28 = T->O priority: LOW
$ 29 = T->O priority: HIGH
$ 30 = T->O priority: SCHEDULED
$ 31 = T->O priority: reserved
Param3,0,, $ O->T RPI, size, format
Param3,Param2,Assem100, $ T->O RPI, size, format
,, $ config #1 size, format
,, $ config #2 size, format
"Listen Only", $ Connection Name
"", $ help string
"20 04 24 C5 2C C7 2C 64"; $ Path
[Port]
Port1 =
TCP, $ port type name
"TCP/IP", $ name of port
"20 F5 24 01", $ instance one of the TCP/IP interface object
2; $ port number
[Capacity]
MaxCIPConnections = 63; $ Max CIP cnx - all classes
TSpec1 = TxRx, 1, 2000; $ Packets per sec @ 1 bytes
TSpec2 = TxRx, 504, 2000; $ Packets per sec @ 504 bytes0 -
Hello Albert,
in the [Connection Manager] section, there is the "Exclusive Owner" connection with this path:
"20 04 24 C5 2C 96 2C 64"
wherein the 96 and 64 stand for the instance numbers (in hex) of the assembly object 04 just as I assumed in my last post. The C5 is the configuration instance number.
If I were you, I'd give it a spin in the EtherNet/IP emulator Ethernet/IP Explorer following the video of the KB article that I mentioned. Just follow along with the above values.
0 -
Hello ALK,
Yes, yesterday i took a look into the simulation software and was very helpfull! I could stablish the comunication with the anybus adapter and could read all the values and work with an implicit comunication.
Im a bit stucked developing the java application for the implicit comunication, i already downloaded and installed a java library and i trying to implement it in my app.
As you pointed before i should do:
"Class 1 connection: a TCP connection over port 44818 has to be set up and a subsequent ForwardOpen request has to be sent and responded. Then, I/O data is exchanged with minimal overhead over UDP port 2222."
With my limited knowledge I understand that i have to:
TCP/IP connection to port 44818 (this already works) --> Make a "ForwardOpen" through this connection --> Then the implicit comunication is started (on port 2222) --> And i should have a function to read/write the data accordingly to my needs.
I will keep you updated on this topic. If there is an example even in other language it could be usefull to me.
Thank you for your time! Have a nice day.
0
サインインしてコメントを残してください。
コメント
8件のコメント