Open LRAJA33 opened 1 year ago
Looks nice so far, please do sudo ethercat rescan
and sudo ethercat xml
to obtain ethercat slave configuration, you just need to put what it prints to the conf/master_config.xml file
Then make sure the path to xml is correct in conf/ethercat.cfg and switch configonly to =0 and then if you have everything installed right OpenPLC log should be printing out the ethercat PDO registries you can access in your PLC program.
Servo drive might honestly be a bit of a tall order, you'll be able to access the PDOs just fine, but if you need to configure the drive through SDOs then sorry, that is not implemented. Etherlabs master is capable of it, but my ethercat_src doesn't expose any mechanism for it, that would have to be created from scratch. Unless you are willing to try your hand at that challenge, I hope your drive has some alternative means to configure it, through usb cable or something.
Anyway, let me know how it goes, I would love to hear my code being used and working out for someone's application.
Dear Friend, Thanks for your kind reply. I have done upto ".xml generation. It would be very helpful if you share the simple code. Based on this i can proceed further. Kindly share sample code
Have you installed OpenPLC with ethercat option? If you start it up do you get EtherCAT PDOs printed out in log?
Like:
Slave0_Channel_1 AT %IX0.0 : BOOL; (* EK1814 EtherCAT-EA-Koppler (1A E-Bus, 4 K. Dig. Ein, 3ms, 4 K. *)
Slave0_Channel_2 AT %IX1.0 : BOOL; (* EK1814 EtherCAT-EA-Koppler (1A E-Bus, 4 K. Dig. Ein, 3ms, 4 K. *)
Slave0_Channel_3 AT %IX2.0 : BOOL; (* EK1814 EtherCAT-EA-Koppler (1A E-Bus, 4 K. Dig. Ein, 3ms, 4 K. *)
....
If so, then you are good to go, just declare those in your PLC program as normal and use them.
When you press Start PLC button on the web interface, you should get something like this
So look at those Runtime Logs and maybe upload that file you sent to pi, should be program_some_name.st
I think there must be something quite wrong there because it sounds like it's not compiling properly
Or you are uploading it incorrectly, you can do it via web interface without needing a pendrive:
Dear friend, I am getting this information while start the PLC. I have shred the image of Web and terminal. I am not getting as you said. Kindly check and give solution
Hi
I think you don't have EtherCAT option installed for OpenPLC, please use install command as indicated in readme
./install.sh linux ethercat
Even if you have raspberry, still use the same command.
As for hiring, I have a job I'm plenty busy with. I'll gladly answer questions I see popping up here when I notice them, but this is pretty experimental piece of FOSS code with near non-existent user base. It's not a commercial product you can expect to deploy from an install wizard and just plug and play. Takes time and effort to get such things working.
If your end goal is a working servo rather than getting open source code to do something it never has before, then there are companies that sell solutions for that sort of thing, CODESYS Group and Beckhoff to bring examples. And even then, paying quite a bit for software and hardware it's not one hour type of task from zero to working result.
In the ethercat.cfg file, switch that to 0
and verbose to 1 gives you more info
I think you almost have everything set up
If you previously did anything to enable modbus, undo that, I don't know how it interacts with ethercat
Looks to me like everything is ok on the ethercat side, modbus is what explodes on trying to open port 502
See if you can disable it
Also, could you post contents of your master_config.xml, as text or file not image
Dear friend Kindly check the master_config.xml. The error is"Socket error during runtime_logs(), is the runtime active?" how to resolve it? master_configxml.txt
Alright, I went through that xml and I think I know what the issues are and all of them are solvable by slightly modifying the xml
First issue, pdo entry Name properties are empty and it doesn't handle it properly, bug on my end
<Name></Name>
simply add names there
Second issue, multiple entries per Pdo elements, I don't think I have built handling for that. Just needs manual reformatting a bit so each entry is in separate pdo element
<RxPdo Sm="2" Fixed="1" Mandatory="1">
<Index>#x1601</Index>
<Name>2nd Recive PDO Maping</Name>
<Entry>
<Index>#x6040</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name></Name>
<DataType>UINT16</DataType>
</Entry>
<Entry>
<Index>#x607a</Index>
<SubIndex>0</SubIndex>
<BitLen>32</BitLen>
<Name></Name>
<DataType>UINT32</DataType>
</Entry>
<Entry>
<Index>#x60ff</Index>
<SubIndex>0</SubIndex>
<BitLen>32</BitLen>
<Name></Name>
<DataType>UINT32</DataType>
</Entry>
Third issue - UINT32 registers, I think on OpenPLC side there was some gap in implementing those way back when so they are not implemented in ethercat_src. Those registries need to be broken up to two UINT16 types each.
I improvised a bit based on https://d.veichi.com/manual/sd700-ethercat-communication-manual-v1.0.pdf and this is what I came up with
at least in config only mode it does it's thing now, no idea how it will perform with actual hardware, some creativity in further customizing the xml file might be needed if things don't work right
Dear friend, Its working. Hearty thanks. !!
Full log: OpenPLC Runtime starting... Interactive Server: Listening on port 43628 Configuring EtherCAT PLC IO Printout, copy this to VAR..END_VAR of main program or something Variable names may be modified at will as long as the adresses and variable sizes remain the same Slave0_Status_Word_registry AT %IW0.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_Actual_location_registry_A AT %IW1.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_Actual_location_registry_B AT %IW2.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_Control_Word_registry AT %QW0.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_Target_position_registry_A AT %QW1.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_Target_position_registry_B AT %QW2.0 : UINT; ( SD700_ECAT_V1.2_G ) Skipping configuration of Slave Devices (mbconfig.cfg file not found) Warning: Persistent Storage file not found EtherCAT simulation only Issued start_modbus() command to start on port: 502 Server: error binding socket => Permission denied Server: waiting for new client... Issued start_dnp3() command to start on port: 20000 DNP3 ID manager: Starting thread (0) DNP3 ID DNP3_Server: Listening on: 0.0.0.0:20000 Issued start_enip() command to start on port: 44818 Server: Listening on port 44818 Server: waiting for new client... Issued stop_pstorage() command
Hi, why i am not getting response like this "4 slave(s). AL states: PREOP. Link is up. Domain1: WC 3. Domain1: State 1. Domain1: WC 4. Domain1: WC 5. Domain1: WC 7. Domain1: State 2. AL states: OP."
Is everything ok? Shall i test with PLC code?
Now i am getting logs in run time. upto this what we called? ethercat connection established with openPLC? can you share the blink code you have done with ek100? i am totally new to this one. i need one reference code. with that i can able to complete. Kindly send
nice!
If you scroll down in the runtime logs what does the rest of it look like? And are the status indicators on the ethernet ports blinking and looking like communication is happening?
As for bare bones simplest blink in OpenPLC? Like so:
Which will yield structured text output file for uploading to web interface like so
PROGRAM program0
VAR
Output1 AT %QX0.0 : BOOL;
END_VAR
Output1 := not Output1;
END_PROGRAM
CONFIGURATION Config0
RESOURCE Res0 ON PLC
TASK task0(INTERVAL := T#20ms,PRIORITY := 0);
PROGRAM instance0 WITH task0 : program0;
END_RESOURCE
END_CONFIGURATION
But of course your situation is quite a bit more complex than blinky-blink, you have status and control words not a singular boolean output
Here is where you would find indication that everything is working right with EtherCAT
Dear friend, Thanks for your unconditional support. These are the full logs of run time
Full log: OpenPLC Runtime starting... Interactive Server: Listening on port 43628 Configuring EtherCAT PLC IO Printout, copy this to VAR..END_VAR of main program or something Variable names may be modified at will as long as the adresses and variable sizes remain the same Slave0_Status_Word_registry AT %IW0.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_Actual_location_registry_A AT %IW1.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_Actual_location_registry_B AT %IW2.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_Control_Word_registry AT %QW0.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_Target_position_registry_A AT %QW1.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_Target_position_registry_B AT %QW2.0 : UINT; ( SD700_ECAT_V1.2_G ) Skipping configuration of Slave Devices (mbconfig.cfg file not found) Warning: Persistent Storage file not found EtherCAT simulation only Issued start_modbus() command to start on port: 502 Server: error binding socket => Permission denied Server: waiting for new client... Issued start_dnp3() command to start on port: 20000 DNP3 ID manager: Starting thread (0) DNP3 ID DNP3_Server: Listening on: 0.0.0.0:20000 Issued start_enip() command to start on port: 44818 Server: Listening on port 44818 Server: waiting for new client... Issued stop_pstorage() command
thanks for the reference code i will work on it
EtherCAT simulation only
Turn configonlyparam off, I need to use it because I dont have real sd700 slave device, but you have real hardware so on your end this param should be set to 0.
Hi, How did you find the vendor Id, product code and revision number? i have referred manual unable to get it.
Id = 8716548
ProductCode="#x01030507" RevisionNo="#x02040608"
Dear friend,
I have compared your xml with sd700 (modified by you). your xml fille working good. and while using sd700 xml file "Sync master 0 [error invalid direction]" error coming. how to solve this sync master error? and other errors are 15:03:53 ERROR /home/lraja/OpenPLCRpi/OpenPLC_v3/utils/ethercat_src/src/ecat_handler/ecat_handler.c:219: Failed to configure PDO-s 15:03:53 ERROR /home/lraja/OpenPLCRpi/OpenPLC_v3/utils/ethercat_src/src/ecat_handler/ecat_handler.c:379: Failed to configure slave 15:03:53 ERROR /home/lraja/OpenPLCRpi/OpenPLC_v3/utils/ethercat_src/src/ecat_handler/ecat_handler.c:426: Releasing master
kindly tell what are the parameter need to configure correctly? i will modify and try
Alright, I found a few issues that are likely affecting you
This is not a case for BOOL type digital IO, but with byte, int, dint registers, if you have a it in EtherCAT IO conf, you need to have it in PLC program too. So if your IO conf says this: Slave0_Status_Word_registry AT %IW0.0 : UINT; ( SD700_ECAT_V1.2_G )
But if you are running a blank program with nothing declared at %IW0.0, it just segfaults the moment ethercat starts working.
Id, Product code, revision etc those all came from your initial conf file, nowhere else.
I don't quite understand the logic of all those modifications you did in your version of xml, lets try the other way, make it as minimal as possible, try the following, it has control register, status register and nothing else.
This will print out IO conf like so:
Slave0_2nd_Send_PDO_Maping AT %IW0.0 : UINT; (* SD700_ECAT_V1.2_G *)
Slave0_2nd_Recive_PDO_Maping AT %QW0.0 : UINT; (* SD700_ECAT_V1.2_G *)
So make sure you have those declared in your plc program
<EtherCATInfoList>
<EtherCATInfo>
<!-- Slave 0 -->
<Vendor>
<Id>8716548</Id>
</Vendor>
<Descriptions>
<Devices>
<Device>
<Type ProductCode="#x01030507" RevisionNo="#x02040608">SD700_ECAT Drive</Type>
<Name><![CDATA[SD700_ECAT_V1.2_G]]></Name>
<Sm Enable="1" StartAddress="#x1100" ControlByte="#x64" DefaultSize="2"/>
<Sm Enable="1" StartAddress="#x1400" ControlByte="#x20" DefaultSize="6"/>
<RxPdo Sm="0" Fixed="1" Mandatory="1">
<Index>#x1601</Index>
<Name>2nd Recive PDO Maping</Name>
<Entry>
<Index>#x6040</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name>ControlRegister</Name>
<DataType>UINT16</DataType>
</Entry>
</RxPdo>
<TxPdo Sm="1" Fixed="1" Mandatory="1">
<Index>#x1a01</Index>
<Name>2nd Send PDO Maping</Name>
<Entry>
<Index>#x6041</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name>StatusRegister</Name>
<DataType>UINT16</DataType>
</Entry>
</TxPdo>
</Device>
</Devices>
</Descriptions>
</EtherCATInfo>
</EtherCATInfoList>
Dear Friend,,
Thank you for your continuous support. I have done it. Kindly check and acknowledge. I have shared the image for your reference
One more help. I want to to write one simple code to turn on and turn off the servo. Now we have configured only status word and control word. Kindly give one simple code to communicate and get the response from servo drive. I have tried one example but it is not working
Kindly help me friend
Well, the good news is the configuration passes successfully and EtherCAT has started communicating.
The bad news is, the drive is stuck in SAFEOP, which means it's not going to do anything. That is likely because we removed those other pdo entries to simplify the problem, so one by one you need to add those back.
Next RxPDO entry is 607a, target location, but it's a 32bit register, OpenPLC only supports up to 16 bit registers. So have to break it up and hope it can work. Same story for 6064 location actual. Let see, try the following:
<EtherCATInfoList>
<EtherCATInfo>
<!-- Slave 0 -->
<Vendor>
<Id>8716548</Id>
</Vendor>
<Descriptions>
<Devices>
<Device>
<Type ProductCode="#x01030507" RevisionNo="#x02040608">SD700_ECAT Drive</Type>
<Name><![CDATA[SD700_ECAT_V1.2_G]]></Name>
<Sm Enable="1" StartAddress="#x1100" ControlByte="#x64" DefaultSize="2"/>
<Sm Enable="1" StartAddress="#x1400" ControlByte="#x20" DefaultSize="6"/>
<RxPdo Sm="0" Fixed="1" Mandatory="1">
<Index>#x1601</Index>
<Name>2nd Recive PDO Maping</Name>
<Entry>
<Index>#x6040</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name>ControlRegister</Name>
<DataType>UINT16</DataType>
</Entry>
</RxPdo>
<RxPdo Sm="0" Fixed="1" Mandatory="1">
<Index>#x1603</Index>
<Name>TargetPosA</Name>
<Entry>
<Index>#x607a</Index>
<SubIndex>1</SubIndex>
<BitLen>16</BitLen>
<Name>Output</Name>
<DataType>UINT16</DataType>
</Entry>
</RxPdo>
<RxPdo Sm="0" Fixed="1" Mandatory="1">
<Index>#x1605</Index>
<Name>TargetPosB</Name>
<Entry>
<Index>#x607c</Index>
<SubIndex>1</SubIndex>
<BitLen>16</BitLen>
<Name>Output</Name>
<DataType>UINT16</DataType>
</Entry>
</RxPdo>
<TxPdo Sm="1" Fixed="1" Mandatory="1">
<Index>#x1a01</Index>
<Name>2nd Send PDO Maping</Name>
<Entry>
<Index>#x6041</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name>StatusRegister</Name>
<DataType>UINT16</DataType>
</Entry>
</TxPdo>
<TxPdo Sm="1" Fixed="1" Mandatory="1">
<Index>#x1a03</Index>
<Name>ActualLocationA</Name>
<Entry>
<Index>#x6064</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name>Input</Name>
<DataType>UINT16</DataType>
</Entry>
</TxPdo>
<TxPdo Sm="1" Fixed="1" Mandatory="1">
<Index>#x1a05</Index>
<Name>ActualLocationB</Name>
<Entry>
<Index>#x6066</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name>Input</Name>
<DataType>UINT16</DataType>
</Entry>
</TxPdo>
</Device>
</Devices>
</Descriptions>
</EtherCATInfo>
</EtherCATInfoList>
Make sure to update on PLC program side and add necessary variables.
Slave0_2nd_Send_PDO_Maping AT %IW0.0 : UINT; (* SD700_ECAT_V1.2_G *)
Slave0_ActualLocationA AT %IW1.0 : UINT; (* SD700_ECAT_V1.2_G *)
Slave0_ActualLocationB AT %IW2.0 : UINT; (* SD700_ECAT_V1.2_G *)
Slave0_2nd_Recive_PDO_Maping AT %QW0.0 : UINT; (* SD700_ECAT_V1.2_G *)
Slave0_TargetPosA AT %QW1.0 : UINT; (* SD700_ECAT_V1.2_G *)
Slave0_TargetPosB AT %QW2.0 : UINT; (* SD700_ECAT_V1.2_G *)
Hi, I am getting the following response after adding the Next PDOs
OpenPLC Runtime starting... Interactive Server: Listening on port 43628 Configuring EtherCAT PLC IO Printout, copy this to VAR..END_VAR of main program or something Variable names may be modified at will as long as the adresses and variable sizes remain the same Slave0_2nd_Send_PDO_Maping AT %IW0.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_ActualLocationA AT %IW1.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_ActualLocationB AT %IW2.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_2nd_Recive_PDO_Maping AT %QW0.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_TargetPosA AT %QW1.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_TargetPosB AT %QW2.0 : UINT; ( SD700_ECAT_V1.2_G ) Persistent Storage: Reading persistent.file into local buffers enabled 1 slave(s). AL states: PREOP. Link is up. Issued start_modbus() command to start on port: 502 Server: Listening on port 502 Server: waiting for new client... Issued start_dnp3() command to start on port: 20000 DNP3 ID manager: Starting thread (0) DNP3 ID DNP3_Server: Listening on: 0.0.0.0:20000 Issued start_enip() command to start on port: 44818 Server: Listening on port 44818 Server: waiting for new client... Issued start_pstorage() command with polling rate of 10 seconds Domain1: WC 2. Domain1: State 1. AL states: SAFEOP.
Again servo drive is stuck in SAFEOP
Try sudo ethercat pdos
see what it prints out, the XML probably has to made to match
hi, the pdos response
lraja@lraja-desktop:~/OpenPLCRpi/OpenPLC_v3$ sudo ethercat pdos SM0: PhysAddr 0x1000, DefaultSize 128, ControlRegister 0x26, Enable 1 SM1: PhysAddr 0x1080, DefaultSize 128, ControlRegister 0x22, Enable 1 SM2: PhysAddr 0x1100, DefaultSize 2, ControlRegister 0x64, Enable 1 RxPDO 0x1601 "2nd Recive PDO Maping" PDO entry 0x6040:00, 16 bit, "" PDO entry 0x607a:00, 32 bit, "" PDO entry 0x60ff:00, 32 bit, "" SM3: PhysAddr 0x1400, DefaultSize 6, ControlRegister 0x20, Enable 1 TxPDO 0x1a01 "2nd Send PDO Maping" PDO entry 0x6041:00, 16 bit, "" PDO entry 0x6064:00, 32 bit, "" PDO entry 0x606c:00, 32 bit, ""
Well, it wants those 0x60ff and 0x606c velocity registers, try adding them see if that improves things
Slave0_2nd_Send_PDO_Maping AT %IW0.0 : UINT; (* SD700_ECAT_V1.2_G *)
Slave0_ActualLocationA AT %IW1.0 : UINT; (* SD700_ECAT_V1.2_G *)
Slave0_ActualLocationB AT %IW2.0 : UINT; (* SD700_ECAT_V1.2_G *)
Slave0_ActualVeloA AT %IW3.0 : UINT; (* SD700_ECAT_V1.2_G *)
Slave0_ActualVeloB AT %IW4.0 : UINT; (* SD700_ECAT_V1.2_G *)
Slave0_2nd_Recive_PDO_Maping AT %QW0.0 : UINT; (* SD700_ECAT_V1.2_G *)
Slave0_TargetPosA AT %QW1.0 : UINT; (* SD700_ECAT_V1.2_G *)
Slave0_TargetPosB AT %QW2.0 : UINT; (* SD700_ECAT_V1.2_G *)
Slave0_TargetVeloA AT %QW3.0 : UINT; (* SD700_ECAT_V1.2_G *)
Slave0_TargetVeloB AT %QW4.0 : UINT; (* SD700_ECAT_V1.2_G *)
Add PLC variables too of course
<EtherCATInfoList>
<EtherCATInfo>
<!-- Slave 0 -->
<Vendor>
<Id>8716548</Id>
</Vendor>
<Descriptions>
<Devices>
<Device>
<Type ProductCode="#x01030507" RevisionNo="#x02040608">SD700_ECAT Drive</Type>
<Name><![CDATA[SD700_ECAT_V1.2_G]]></Name>
<Sm Enable="1" StartAddress="#x1100" ControlByte="#x64" DefaultSize="2"/>
<Sm Enable="1" StartAddress="#x1400" ControlByte="#x20" DefaultSize="6"/>
<RxPdo Sm="0" Fixed="1" Mandatory="1">
<Index>#x1601</Index>
<Name>2nd Recive PDO Maping</Name>
<Entry>
<Index>#x6040</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name>ControlRegister</Name>
<DataType>UINT16</DataType>
</Entry>
</RxPdo>
<RxPdo Sm="0" Fixed="1" Mandatory="1">
<Index>#x1603</Index>
<Name>TargetPosA</Name>
<Entry>
<Index>#x607a</Index>
<SubIndex>1</SubIndex>
<BitLen>16</BitLen>
<Name>Output</Name>
<DataType>UINT16</DataType>
</Entry>
</RxPdo>
<RxPdo Sm="0" Fixed="1" Mandatory="1">
<Index>#x1605</Index>
<Name>TargetPosB</Name>
<Entry>
<Index>#x607c</Index>
<SubIndex>1</SubIndex>
<BitLen>16</BitLen>
<Name>Output</Name>
<DataType>UINT16</DataType>
</Entry>
</RxPdo>
<RxPdo Sm="0" Fixed="1" Mandatory="1">
<Index>#x1607</Index>
<Name>TargetVeloA</Name>
<Entry>
<Index>#x60ff</Index>
<SubIndex>1</SubIndex>
<BitLen>16</BitLen>
<Name>Output</Name>
<DataType>UINT16</DataType>
</Entry>
</RxPdo>
<RxPdo Sm="0" Fixed="1" Mandatory="1">
<Index>#x1609</Index>
<Name>TargetVeloB</Name>
<Entry>
<Index>#x6101</Index>
<SubIndex>1</SubIndex>
<BitLen>16</BitLen>
<Name>Output</Name>
<DataType>UINT16</DataType>
</Entry>
</RxPdo>
<TxPdo Sm="1" Fixed="1" Mandatory="1">
<Index>#x1a01</Index>
<Name>2nd Send PDO Maping</Name>
<Entry>
<Index>#x6041</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name>StatusRegister</Name>
<DataType>UINT16</DataType>
</Entry>
</TxPdo>
<TxPdo Sm="1" Fixed="1" Mandatory="1">
<Index>#x1a03</Index>
<Name>ActualLocationA</Name>
<Entry>
<Index>#x6064</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name>Input</Name>
<DataType>UINT16</DataType>
</Entry>
</TxPdo>
<TxPdo Sm="1" Fixed="1" Mandatory="1">
<Index>#x1a05</Index>
<Name>ActualLocationB</Name>
<Entry>
<Index>#x6066</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name>Input</Name>
<DataType>UINT16</DataType>
</Entry>
</TxPdo>
<TxPdo Sm="1" Fixed="1" Mandatory="1">
<Index>#x1a07</Index>
<Name>ActualVeloA</Name>
<Entry>
<Index>#x606c</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name>Input</Name>
<DataType>UINT16</DataType>
</Entry>
</TxPdo>
<TxPdo Sm="1" Fixed="1" Mandatory="1">
<Index>#x1a09</Index>
<Name>ActualVeloB</Name>
<Entry>
<Index>#x606e</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name>Input</Name>
<DataType>UINT16</DataType>
</Entry>
</TxPdo>
</Device>
</Devices>
</Descriptions>
</EtherCATInfo>
</EtherCATInfoList>
Hi, the web runtime response after adding the above one
OpenPLC Runtime starting... Interactive Server: Listening on port 43628 Configuring EtherCAT PLC IO Printout, copy this to VAR..END_VAR of main program or something Variable names may be modified at will as long as the adresses and variable sizes remain the same Slave0_2nd_Send_PDO_Maping AT %IW0.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_ActualLocationA AT %IW1.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_ActualLocationB AT %IW2.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_ActualVeloA AT %IW3.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_ActualVeloB AT %IW4.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_2nd_Recive_PDO_Maping AT %QW0.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_TargetPosA AT %QW1.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_TargetPosB AT %QW2.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_TargetVeloA AT %QW3.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_TargetVeloB AT %QW4.0 : UINT; ( SD700_ECAT_V1.2_G ) Persistent Storage: Reading persistent.file into local buffers enabled 1 slave(s). AL states: SAFEOP. Link is up. Domain1: WC 2. Domain1: State 1. Issued start_modbus() command to start on port: 502 Server: Listening on port 502 Server: waiting for new client... Issued start_dnp3() command to start on port: 20000 DNP3 ID manager: Starting thread (0) DNP3 ID DNP3_Server: Listening on: 0.0.0.0:20000 Issued start_enip() command to start on port: 44818 Server: Listening on port 44818 Server: waiting for new client... Issued start_pstorage() command with polling rate of 10 seconds
hmmmm... maybe it really wants those sync managers with zero PDOs on them for some reason
SM0: PhysAddr 0x1000, DefaultSize 128, ControlRegister 0x26, Enable 1 SM1: PhysAddr 0x1080, DefaultSize 128, ControlRegister 0x22, Enable 1
As you remember, that threw an error previously, well, I did an update so it should at least pass configuration.
So first pull latest https://github.com/r2k-in-the-vortex/ethercat_src
then redo ./install.sh linux ethercat
for OpenPLC
and then try the following xml
<EtherCATInfoList>
<EtherCATInfo>
<!-- Slave 0 -->
<Vendor>
<Id>8716548</Id>
</Vendor>
<Descriptions>
<Devices>
<Device>
<Type ProductCode="#x01030507" RevisionNo="#x02040608">SD700_ECAT Drive</Type>
<Name><![CDATA[SD700_ECAT_V1.2_G]]></Name>
<Sm Enable="1" StartAddress="#x1000" ControlByte="#x26" DefaultSize="128" />
<Sm Enable="1" StartAddress="#x1080" ControlByte="#x22" DefaultSize="128" />
<Sm Enable="1" StartAddress="#x1100" ControlByte="#x64" DefaultSize="2"/>
<Sm Enable="1" StartAddress="#x1400" ControlByte="#x20" DefaultSize="6"/>
<RxPdo Sm="2" Fixed="1" Mandatory="1">
<Index>#x1601</Index>
<Name>2nd Recive PDO Maping</Name>
<Entry>
<Index>#x6040</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name>ControlRegister</Name>
<DataType>UINT16</DataType>
</Entry>
</RxPdo>
<RxPdo Sm="2" Fixed="1" Mandatory="1">
<Index>#x1603</Index>
<Name>TargetPosA</Name>
<Entry>
<Index>#x607a</Index>
<SubIndex>1</SubIndex>
<BitLen>16</BitLen>
<Name>Output</Name>
<DataType>UINT16</DataType>
</Entry>
</RxPdo>
<RxPdo Sm="2" Fixed="1" Mandatory="1">
<Index>#x1605</Index>
<Name>TargetPosB</Name>
<Entry>
<Index>#x607c</Index>
<SubIndex>1</SubIndex>
<BitLen>16</BitLen>
<Name>Output</Name>
<DataType>UINT16</DataType>
</Entry>
</RxPdo>
<RxPdo Sm="2" Fixed="1" Mandatory="1">
<Index>#x1607</Index>
<Name>TargetVeloA</Name>
<Entry>
<Index>#x60ff</Index>
<SubIndex>1</SubIndex>
<BitLen>16</BitLen>
<Name>Output</Name>
<DataType>UINT16</DataType>
</Entry>
</RxPdo>
<RxPdo Sm="2" Fixed="1" Mandatory="1">
<Index>#x1609</Index>
<Name>TargetVeloB</Name>
<Entry>
<Index>#x6101</Index>
<SubIndex>1</SubIndex>
<BitLen>16</BitLen>
<Name>Output</Name>
<DataType>UINT16</DataType>
</Entry>
</RxPdo>
<TxPdo Sm="3" Fixed="1" Mandatory="1">
<Index>#x1a01</Index>
<Name>2nd Send PDO Maping</Name>
<Entry>
<Index>#x6041</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name>StatusRegister</Name>
<DataType>UINT16</DataType>
</Entry>
</TxPdo>
<TxPdo Sm="3" Fixed="1" Mandatory="1">
<Index>#x1a03</Index>
<Name>ActualLocationA</Name>
<Entry>
<Index>#x6064</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name>Input</Name>
<DataType>UINT16</DataType>
</Entry>
</TxPdo>
<TxPdo Sm="3" Fixed="1" Mandatory="1">
<Index>#x1a05</Index>
<Name>ActualLocationB</Name>
<Entry>
<Index>#x6066</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name>Input</Name>
<DataType>UINT16</DataType>
</Entry>
</TxPdo>
<TxPdo Sm="3" Fixed="1" Mandatory="1">
<Index>#x1a07</Index>
<Name>ActualVeloA</Name>
<Entry>
<Index>#x606c</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name>Input</Name>
<DataType>UINT16</DataType>
</Entry>
</TxPdo>
<TxPdo Sm="3" Fixed="1" Mandatory="1">
<Index>#x1a09</Index>
<Name>ActualVeloB</Name>
<Entry>
<Index>#x606e</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name>Input</Name>
<DataType>UINT16</DataType>
</Entry>
</TxPdo>
</Device>
</Devices>
</Descriptions>
</EtherCATInfo>
</EtherCATInfoList>
Dear friend, I have referred one forum related to SAFEOP . They shared the below solution
"Ok so I have solved this problem. The dual channel AX5000 does take a very long time to transition from PREOP->SAFEOP->OP.
I changed this in the ethercat master to 10 seconds. +#define EC_AL_STATE_CHANGE_TIMEOUT 10
After that things have worked reliably."
Is it acceptable solution? if so , tell where i have to change to increase the time. I tried but i could not get the right parameter
Kindly help me
I don't think this is the issue you are having. This is not the same drive and you know the master conf is less than perfect fit because of OpenPLC compadibilities. It's not surprising it stays stuck in safeop when it doesn't get exactly the configuration it's asking for.
But if you wanted to change it, then here this parameter is https://gitlab.com/etherlab.org/ethercat/-/blob/master/master/fsm_change.c#L45
Yes. This solution not working. I will pull the latest one and try it as you suggested
I have pulled the recent files No change , still drive stuck in SAFEOP
OpenPLC Runtime starting... Interactive Server: Listening on port 43628 Configuring EtherCAT PLC IO Printout, copy this to VAR..END_VAR of main program or something Variable names may be modified at will as long as the adresses and variable sizes remain the same Slave0_2nd_Send_PDO_Maping AT %IW0.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_ActualLocationA AT %IW1.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_ActualLocationB AT %IW2.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_ActualVeloA AT %IW3.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_ActualVeloB AT %IW4.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_2nd_Recive_PDO_Maping AT %QW0.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_TargetPosA AT %QW1.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_TargetPosB AT %QW2.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_TargetVeloA AT %QW3.0 : UINT; ( SD700_ECAT_V1.2_G ) Slave0_TargetVeloB AT %QW4.0 : UINT; ( SD700_ECAT_V1.2_G ) Persistent Storage: Reading persistent.file into local buffers enabled 1 slave(s). AL states: SAFEOP. Link is up. Domain1: WC 2. Domain1: State 1. Issued start_modbus() command to start on port: 502 Server: Listening on port 502 Server: waiting for new client... Issued start_dnp3() command to start on port: 20000 DNP3 ID manager: Starting thread (0) DNP3 ID DNP3_Server: Listening on: 0.0.0.0:20000 Issued start_enip() command to start on port: 44818 Server: Listening on port 44818 Server: waiting for new client... Issued start_pstorage() command with polling rate of 10 seconds
Hmmzz.... I guess it really wants those registers to be 32bit not 2x16bit then.
I think this is an update I can do, but not today, I'll see about it tomorrow evening.
Ok..friend.
On Mon, 20 Nov, 2023, 1:09 am r2k-in-the-vortex, @.***> wrote:
Hmmzz.... I guess it really wants those registers to be 32bit not 2x16bit then.
I think this is an update I can do, but not today, I'll see about it tomorrow evening.
— Reply to this email directly, view it on GitHub https://github.com/r2k-in-the-vortex/ethercat_src/issues/5#issuecomment-1817956983, or unsubscribe https://github.com/notifications/unsubscribe-auth/AZCBRFNKF6MMARHARLCSHCDYFJN6TAVCNFSM6AAAAAA7BQZF4CVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMJXHE2TMOJYGM . You are receiving this because you authored the thread.Message ID: @.***>
Dear friend, Any update. ? Kindly tell the ways I will.also try
Alright, see what the following does
https://github.com/r2k-in-the-vortex/ethercat_src/tree/wideregistersupport https://github.com/r2k-in-the-vortex/OpenPLC_v3/tree/wideregistersupport
and the xml as follows
<EtherCATInfoList>
<EtherCATInfo>
<!-- Slave 0 -->
<Vendor>
<Id>8716548</Id>
</Vendor>
<Descriptions>
<Devices>
<Device>
<Type ProductCode="#x01030507" RevisionNo="#x02040608">SD700_ECAT Drive</Type>
<Name><![CDATA[SD700_ECAT_V1.2_G]]></Name>
<Sm Enable="1" StartAddress="#x1000" ControlByte="#x26" DefaultSize="128" />
<Sm Enable="1" StartAddress="#x1080" ControlByte="#x22" DefaultSize="128" />
<Sm Enable="1" StartAddress="#x1100" ControlByte="#x64" DefaultSize="2"/>
<Sm Enable="1" StartAddress="#x1400" ControlByte="#x20" DefaultSize="6"/>
<RxPdo Sm="2" Fixed="1" Mandatory="1">
<Index>#x1601</Index>
<Name>2nd Recive PDO Maping</Name>
<Entry>
<Index>#x6040</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name>ControlRegister</Name>
<DataType>UINT16</DataType>
</Entry>
</RxPdo>
<RxPdo Sm="2" Fixed="1" Mandatory="1">
<Index>#x1603</Index>
<Name>TargetPos</Name>
<Entry>
<Index>#x607a</Index>
<SubIndex>1</SubIndex>
<BitLen>32</BitLen>
<Name>Output</Name>
<DataType>UINT32</DataType>
</Entry>
</RxPdo>
<RxPdo Sm="2" Fixed="1" Mandatory="1">
<Index>#x1607</Index>
<Name>TargetVelo</Name>
<Entry>
<Index>#x60ff</Index>
<SubIndex>1</SubIndex>
<BitLen>32</BitLen>
<Name>Output</Name>
<DataType>UINT32</DataType>
</Entry>
</RxPdo>
<TxPdo Sm="3" Fixed="1" Mandatory="1">
<Index>#x1a01</Index>
<Name>2nd Send PDO Maping</Name>
<Entry>
<Index>#x6041</Index>
<SubIndex>0</SubIndex>
<BitLen>16</BitLen>
<Name>StatusRegister</Name>
<DataType>UINT16</DataType>
</Entry>
</TxPdo>
<TxPdo Sm="3" Fixed="1" Mandatory="1">
<Index>#x1a03</Index>
<Name>ActualLocation</Name>
<Entry>
<Index>#x6064</Index>
<SubIndex>0</SubIndex>
<BitLen>32</BitLen>
<Name>Input</Name>
<DataType>UINT32</DataType>
</Entry>
</TxPdo>
<TxPdo Sm="3" Fixed="1" Mandatory="1">
<Index>#x1a07</Index>
<Name>ActualVelo</Name>
<Entry>
<Index>#x606c</Index>
<SubIndex>0</SubIndex>
<BitLen>32</BitLen>
<Name>Input</Name>
<DataType>UINT32</DataType>
</Entry>
</TxPdo>
</Device>
</Devices>
</Descriptions>
</EtherCATInfo>
</EtherCATInfoList>
with io conf like so
VAR
Slave0_2nd_Send_PDO_Maping AT %IW0.0 : UINT; (* SD700_ECAT_V1.2_G *)
Slave0_ActualLocation AT %ID1.0 : DINT; (* SD700_ECAT_V1.2_G *)
Slave0_ActualVelo AT %ID2.0 : DINT; (* SD700_ECAT_V1.2_G *)
Slave0_2nd_Recive_PDO_Maping AT %QW0.0 : UINT; (* SD700_ECAT_V1.2_G *)
Slave0_TargetPos AT %QD1.0 : DINT; (* SD700_ECAT_V1.2_G *)
Slave0_TargetVelo AT %QD2.0 : DINT; (* SD700_ECAT_V1.2_G *)
END_VAR
Alright, see what the following does
https://github.com/r2k-in-the-vortex/ethercat_src/tree/wideregistersupport https://github.com/r2k-in-the-vortex/OpenPLC_v3/tree/wideregistersupport
and the xml as follows
<EtherCATInfoList> <EtherCATInfo> <!-- Slave 0 --> <Vendor> <Id>8716548</Id> </Vendor> <Descriptions> <Devices> <Device> <Type ProductCode="#x01030507" RevisionNo="#x02040608">SD700_ECAT Drive</Type> <Name><![CDATA[SD700_ECAT_V1.2_G]]></Name> <Sm Enable="1" StartAddress="#x1000" ControlByte="#x26" DefaultSize="128" /> <Sm Enable="1" StartAddress="#x1080" ControlByte="#x22" DefaultSize="128" /> <Sm Enable="1" StartAddress="#x1100" ControlByte="#x64" DefaultSize="2"/> <Sm Enable="1" StartAddress="#x1400" ControlByte="#x20" DefaultSize="6"/> <RxPdo Sm="2" Fixed="1" Mandatory="1"> <Index>#x1601</Index> <Name>2nd Recive PDO Maping</Name> <Entry> <Index>#x6040</Index> <SubIndex>0</SubIndex> <BitLen>16</BitLen> <Name>ControlRegister</Name> <DataType>UINT16</DataType> </Entry> </RxPdo> <RxPdo Sm="2" Fixed="1" Mandatory="1"> <Index>#x1603</Index> <Name>TargetPos</Name> <Entry> <Index>#x607a</Index> <SubIndex>1</SubIndex> <BitLen>32</BitLen> <Name>Output</Name> <DataType>UINT32</DataType> </Entry> </RxPdo> <RxPdo Sm="2" Fixed="1" Mandatory="1"> <Index>#x1607</Index> <Name>TargetVelo</Name> <Entry> <Index>#x60ff</Index> <SubIndex>1</SubIndex> <BitLen>32</BitLen> <Name>Output</Name> <DataType>UINT32</DataType> </Entry> </RxPdo> <TxPdo Sm="3" Fixed="1" Mandatory="1"> <Index>#x1a01</Index> <Name>2nd Send PDO Maping</Name> <Entry> <Index>#x6041</Index> <SubIndex>0</SubIndex> <BitLen>16</BitLen> <Name>StatusRegister</Name> <DataType>UINT16</DataType> </Entry> </TxPdo> <TxPdo Sm="3" Fixed="1" Mandatory="1"> <Index>#x1a03</Index> <Name>ActualLocation</Name> <Entry> <Index>#x6064</Index> <SubIndex>0</SubIndex> <BitLen>32</BitLen> <Name>Input</Name> <DataType>UINT32</DataType> </Entry> </TxPdo> <TxPdo Sm="3" Fixed="1" Mandatory="1"> <Index>#x1a07</Index> <Name>ActualVelo</Name> <Entry> <Index>#x606c</Index> <SubIndex>0</SubIndex> <BitLen>32</BitLen> <Name>Input</Name> <DataType>UINT32</DataType> </Entry> </TxPdo> </Device> </Devices> </Descriptions> </EtherCATInfo> </EtherCATInfoList>
with io conf like so
VAR Slave0_2nd_Send_PDO_Maping AT %IW0.0 : UINT; (* SD700_ECAT_V1.2_G *) Slave0_ActualLocation AT %ID1.0 : DINT; (* SD700_ECAT_V1.2_G *) Slave0_ActualVelo AT %ID2.0 : DINT; (* SD700_ECAT_V1.2_G *) Slave0_2nd_Recive_PDO_Maping AT %QW0.0 : UINT; (* SD700_ECAT_V1.2_G *) Slave0_TargetPos AT %QD1.0 : DINT; (* SD700_ECAT_V1.2_G *) Slave0_TargetVelo AT %QD2.0 : DINT; (* SD700_ECAT_V1.2_G *) END_VAR
Dear friend, This is not working for me
hmmmm... maybe it really wants those sync managers with zero PDOs on them for some reason
SM0: PhysAddr 0x1000, DefaultSize 128, ControlRegister 0x26, Enable 1 SM1: PhysAddr 0x1080, DefaultSize 128, ControlRegister 0x22, Enable 1
As you remember, that threw an error previously, well, I did an update so it should at least pass configuration. So first pull latest https://github.com/r2k-in-the-vortex/ethercat_src then redo
./install.sh linux ethercat
for OpenPLC and then try the following xml<EtherCATInfoList> <EtherCATInfo> <!-- Slave 0 --> <Vendor> <Id>8716548</Id> </Vendor> <Descriptions> <Devices> <Device> <Type ProductCode="#x01030507" RevisionNo="#x02040608">SD700_ECAT Drive</Type> <Name><![CDATA[SD700_ECAT_V1.2_G]]></Name> <Sm Enable="1" StartAddress="#x1000" ControlByte="#x26" DefaultSize="128" /> <Sm Enable="1" StartAddress="#x1080" ControlByte="#x22" DefaultSize="128" /> <Sm Enable="1" StartAddress="#x1100" ControlByte="#x64" DefaultSize="2"/> <Sm Enable="1" StartAddress="#x1400" ControlByte="#x20" DefaultSize="6"/> <RxPdo Sm="2" Fixed="1" Mandatory="1"> <Index>#x1601</Index> <Name>2nd Recive PDO Maping</Name> <Entry> <Index>#x6040</Index> <SubIndex>0</SubIndex> <BitLen>16</BitLen> <Name>ControlRegister</Name> <DataType>UINT16</DataType> </Entry> </RxPdo> <RxPdo Sm="2" Fixed="1" Mandatory="1"> <Index>#x1603</Index> <Name>TargetPosA</Name> <Entry> <Index>#x607a</Index> <SubIndex>1</SubIndex> <BitLen>16</BitLen> <Name>Output</Name> <DataType>UINT16</DataType> </Entry> </RxPdo> <RxPdo Sm="2" Fixed="1" Mandatory="1"> <Index>#x1605</Index> <Name>TargetPosB</Name> <Entry> <Index>#x607c</Index> <SubIndex>1</SubIndex> <BitLen>16</BitLen> <Name>Output</Name> <DataType>UINT16</DataType> </Entry> </RxPdo> <RxPdo Sm="2" Fixed="1" Mandatory="1"> <Index>#x1607</Index> <Name>TargetVeloA</Name> <Entry> <Index>#x60ff</Index> <SubIndex>1</SubIndex> <BitLen>16</BitLen> <Name>Output</Name> <DataType>UINT16</DataType> </Entry> </RxPdo> <RxPdo Sm="2" Fixed="1" Mandatory="1"> <Index>#x1609</Index> <Name>TargetVeloB</Name> <Entry> <Index>#x6101</Index> <SubIndex>1</SubIndex> <BitLen>16</BitLen> <Name>Output</Name> <DataType>UINT16</DataType> </Entry> </RxPdo> <TxPdo Sm="3" Fixed="1" Mandatory="1"> <Index>#x1a01</Index> <Name>2nd Send PDO Maping</Name> <Entry> <Index>#x6041</Index> <SubIndex>0</SubIndex> <BitLen>16</BitLen> <Name>StatusRegister</Name> <DataType>UINT16</DataType> </Entry> </TxPdo> <TxPdo Sm="3" Fixed="1" Mandatory="1"> <Index>#x1a03</Index> <Name>ActualLocationA</Name> <Entry> <Index>#x6064</Index> <SubIndex>0</SubIndex> <BitLen>16</BitLen> <Name>Input</Name> <DataType>UINT16</DataType> </Entry> </TxPdo> <TxPdo Sm="3" Fixed="1" Mandatory="1"> <Index>#x1a05</Index> <Name>ActualLocationB</Name> <Entry> <Index>#x6066</Index> <SubIndex>0</SubIndex> <BitLen>16</BitLen> <Name>Input</Name> <DataType>UINT16</DataType> </Entry> </TxPdo> <TxPdo Sm="3" Fixed="1" Mandatory="1"> <Index>#x1a07</Index> <Name>ActualVeloA</Name> <Entry> <Index>#x606c</Index> <SubIndex>0</SubIndex> <BitLen>16</BitLen> <Name>Input</Name> <DataType>UINT16</DataType> </Entry> </TxPdo> <TxPdo Sm="3" Fixed="1" Mandatory="1"> <Index>#x1a09</Index> <Name>ActualVeloB</Name> <Entry> <Index>#x606e</Index> <SubIndex>0</SubIndex> <BitLen>16</BitLen> <Name>Input</Name> <DataType>UINT16</DataType> </Entry> </TxPdo> </Device> </Devices> </Descriptions> </EtherCATInfo>
This is working for me. I dont know the reason.
Dear friend, kindly share the code for testing.
When you got this, I'm sure you were running old code still, the line of code to print that just plain doesn't exist in latest code I linked.
Fetching new code and rerunning ./install.sh linux ethercat
is what probably did the trick.
Maybe there was a similar issue earlier why that version of xml with all 16bit registers didn't work the first time, but is now working fine. Well as long as it's working all is good.
Anyway, you now have the slave in OP state, everything running on EtherCAT and OpenPLC end. How to configure the servo drive and write the PLC code to actually move the motor, that's an exercise I'll leave to you. I have never used that particular brand of servo drives before, so I wouldn't know anything about it. I'd start from trying to jog it via usb configuration port, that seems like a reasonable starting point.
Dear friend, I have done the jog test of servo drive using usb and sd soft software installed on the host machine.
I don't know how to start. But I have controled the servo using codesys ide with function block like Mc_power, Mc_moveabsolute and move relative.
There are a control word status word ,target velocity and target position index register.
If I get on / off code for reference, then I will develop further. Possible kindly help. Else i will try .Really thanks for the kind help and support
On Tue, 21 Nov, 2023, 9:15 pm r2k-in-the-vortex, @.***> wrote:
When you got this, I'm sure you were running old code still, the line of code to print that just plain doesn't exist in latest code I linked. [image: image] https://user-images.githubusercontent.com/30666740/284632038-abc99ff6-45cc-4c45-9850-537fa1c61dee.png
Fetching new code and rerunning ./install.sh linux ethercat is what probably did the trick. Maybe there was a similar issue earlier why that version of xml with all 16bit registers didn't work the first time, but is now working fine so all is good.
Anyway, you now have the slave in OP state, everything running on EtherCAT and OpenPLC end. How to configure the servo drive and write the PLC code to actually move the motor, that's an exercise I'll leave to you. I have never used that particular brand of servo drives before, so I wouldn't know anything about it. I'd start from trying to jog it via usb configuration port, that seems like a reasonable starting point.
— Reply to this email directly, view it on GitHub https://github.com/r2k-in-the-vortex/ethercat_src/issues/5#issuecomment-1821178562, or unsubscribe https://github.com/notifications/unsubscribe-auth/AZCBRFJYH3LMLXY6PKEF7JDYFTEB3AVCNFSM6AAAAAA7BQZF4CVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMRRGE3TQNJWGI . You are receiving this because you authored the thread.Message ID: @.***>
Well there is no MC_Power in OpenPLC. But reading status, writing to control register, that you can do easily enough. This is already in the right direction:
You just need to work through the documentation, what each bit in registers means and experiment with it.
Hi...the new code only I am getting this error for 32 bit indexing
The new code and old codes are working fine with 16bit indexing. I have tested. Big thanks to you.
On Tue, 21 Nov, 2023, 9:31 pm RAJASEKAR L, @.***> wrote:
Dear friend, I have done the jog test of servo drive using usb and sd soft software installed on the host machine.
I don't know how to start. But I have controled the servo using codesys ide with function block like Mc_power, Mc_moveabsolute and move relative.
There are a control word status word ,target velocity and target position index register.
If I get on / off code for reference, then I will develop further. Possible kindly help. Else i will try .Really thanks for the kind help and support
On Tue, 21 Nov, 2023, 9:15 pm r2k-in-the-vortex, @.***> wrote:
When you got this, I'm sure you were running old code still, the line of code to print that just plain doesn't exist in latest code I linked. [image: image] https://user-images.githubusercontent.com/30666740/284632038-abc99ff6-45cc-4c45-9850-537fa1c61dee.png
Fetching new code and rerunning ./install.sh linux ethercat is what probably did the trick. Maybe there was a similar issue earlier why that version of xml with all 16bit registers didn't work the first time, but is now working fine so all is good.
Anyway, you now have the slave in OP state, everything running on EtherCAT and OpenPLC end. How to configure the servo drive and write the PLC code to actually move the motor, that's an exercise I'll leave to you. I have never used that particular brand of servo drives before, so I wouldn't know anything about it. I'd start from trying to jog it via usb configuration port, that seems like a reasonable starting point.
— Reply to this email directly, view it on GitHub https://github.com/r2k-in-the-vortex/ethercat_src/issues/5#issuecomment-1821178562, or unsubscribe https://github.com/notifications/unsubscribe-auth/AZCBRFJYH3LMLXY6PKEF7JDYFTEB3AVCNFSM6AAAAAA7BQZF4CVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMRRGE3TQNJWGI . You are receiving this because you authored the thread.Message ID: @.***>
Ok..friend I will check morning whether I have tested in right way. And I will update you
When you got this, I'm sure you were running old code still, the line of code to print that just plain doesn't exist in latest code I linked.
Fetching new code and rerunning
./install.sh linux ethercat
is what probably did the trick. Maybe there was a similar issue earlier why that version of xml with all 16bit registers didn't work the first time, but is now working fine. Well as long as it's working all is good.Anyway, you now have the slave in OP state, everything running on EtherCAT and OpenPLC end. How to configure the servo drive and write the PLC code to actually move the motor, that's an exercise I'll leave to you. I have never used that particular brand of servo drives before, so I wouldn't know anything about it. I'd start from trying to jog it via usb configuration port, that seems like a reasonable starting point.
Dear Friend, In veichi servo drive, target position, target velocity index registers are DINT32. In your xml you have mentioned UIN16 , but i have changed DINT16, so only it was not worked for me.
hi, one small doubt, Can we use STM32 ,i.mx6 or i.mx8 processor in OpenPLC ?if yes how to use the IO access for different board?
Hey, OpenPLC can run on all sorts of hardware, but I'm not familiar with most possible lower powered platforms, you would have to search around in documentation and forum for that. This EtherCAT implementation here uses IgH EtherCAT Master, if you can get that running on your hardware and OS, then OpenPLC will be able to use it, if not, I can't really help with that, refer to etherlab.
As for datatypes in xml, this field is cosmetic, ethercat_src handles everything according to bitlen, even if you write a invalid datatype like DINT16 into XML, it doesn't do anything. But you do need to declare a correct size variable in PLC program and more importantly, the correct type of IO location, X, B, W, D or L.
bitlen | variable size in EtherCAT frame | PLC types | PLC IO location |
---|---|---|---|
1 | 1 bit | BOOL | %IX0.0 |
8 | 1 byte | SINT, USINT, BYTE | %IB0.0 |
16 | 2 bytes | INT, UINT, WORD | %IW0.0 |
32 | 4 bytes | DINT, UDINT, DWORD, REAL | %ID0.0 |
64 | 8 bytes | LINT, ULINT, LWORD, LREAL | %IL0.0 |
Thanks for your kind reply.
http://www.bitsathy.ac.in/ Dr RAJASEKAR L | ASP Electronics and Instrumentation Engineering Bannari Amman Institute of Technology Sathyamangalam, Erode - 638 401 https://goo.gl/maps/rkMMcedqLVpzaDEY9 [image: T] +91 96007 66788 <%20+91%2096007%2066788> | 04295 226000 <%2004295%20226000> [image: M] @.***
On Wed, Nov 22, 2023 at 10:26 PM r2k-in-the-vortex @.***> wrote:
Hey, OpenPLC can run on all sorts of hardware, but I'm not familiar with most possible lower powered platforms, you would have to search around in documentation and forum for that. This EtherCAT implementation here uses IgH EtherCAT Master https://gitlab.com/etherlab.org/ethercat, if you can get that running on your hardware and OS, then OpenPLC will be able to use it, if not, I can't really help with that, refer to etherlab.
As for datatypes in xml, this field is cosmetic, ethercat_src handles everything according to bitlen, even if you write a invalid datatype like DINT16 into XML, it doesn't do anything. But you do need to declare a correct size variable in PLC program. bitlen variable size PLC types 1 1 byte BOOL 8 1 byte SINT, USINT, BYTE 16 2 bytes INT, UINT, WORD 32 4 bytes DINT, UDINT, DWORD, REAL 64 8 bytes LINT, ULINT, LWORD, LREAL
— Reply to this email directly, view it on GitHub https://github.com/r2k-in-the-vortex/ethercat_src/issues/5#issuecomment-1823145691, or unsubscribe https://github.com/notifications/unsubscribe-auth/AZCBRFLO2FX43TR2F6HGBG3YFYVD5AVCNFSM6AAAAAA7BQZF4CVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMRTGE2DKNRZGE . You are receiving this because you authored the thread.Message ID: @.***>
Thanks for your kind reply. I have refered the openplc documentation. Currently, OpenPLC Runtime is officially supported on the following platforms:
Arduino Uno / Nano / Leonardo / Micro Arduino Mega / Due Arduino Nano Every / IoT / BLE Arduino RB2040 Connect Arduino Mkr / Zero / WiFi Arduino Pro (Machine Control and EDGE) Controllino Maxi / Automation / Mega / Mini Productivity Open P1AM ESP8266 (nodemcu) ESP32 Raspberry Pi 2 / 3 / 4 PiXtend UniPi Industrial Platform Neuron PLC FreeWave Zumlink FreeWave ZumIQ Windows (generic target as a soft-PLC) Linux (generic target as a soft-PLC)
PHYSICAL ADDRESSING are give for the above hardware's only.
suppose if i use the i.mx6 type of hardware, how to do the PHYSICAL ADDRESSING?
As of right now, ethercat_src is only compatible with OpenPLC hardware platform Linux (generic target as a soft-PLC)
That+ethercat is what you select when you install OpenPLC with option ./install.sh linux ethercat
It of course means the local IO of raspberry will not work at the same time with ethercat. It could be done by shifting EtherCAT IO so they wouldn't conflict with local IO, figuring out all the correct install scripts of OpenPLC etc, but it hasn't been done. If you wish, you are welcome to fork the repo and have a go at it, but maybe its easier to just get some ethercat IO modules.
If you wish to use local IO with OpenPLC on some unsupported platform, then you have to write the support for that platform. You can find the examples under hardware layers
Dear Friend, I was unable to make it work. I have used the xml shared by you `============================
=================================` I have pull out the git. it says it was upto date., but related /modified files for 32 bit not updated. So i have copy and paste the files (ethercat_src.c, ethercat_src.h,main.c and files in the ethercat handler)
There is no error, but slave in PREOP state always. and after some time "socket error coming on the rpi terminal, and run time logs are gone with empty.I cant able to find the issues. kindly check and do the needful
Hi,
I have tried to connect Etherlab igh Ethercat master with OpenPLC using ethercat_src. It is working. I can able to read the slave information by running "Ethercat master command".
upto this ok? or need to do some more steps for ethercat.
I need to write the code to control the velocity and position of the ethercat servo drive. I dont know how to start. Kindly tell me the procedure. How to write a code to control the servo motor using OpenPLC IDE ? and How to configure ".*xml " file in OpenPLC It would be very helpful , if you share the example code for the same.