Comments (14)
Why not simple add a uint32 * to ->data, that way you won’t need a COE change.
Also, to create a conformant slave you need to do more, update the ESI and EEPROM letting the Master/configurator know you support PdoConfiguration eg. that 1601 is dynamic.
from soes.
Hi,
I took a look at your suggestion - it looks better!
I have a couple of questions / issues: (these might be a config issue on my end)
I can do a uint32* to ->data as per your suggestion.
For my test case, I'm only altering the length of 0x1601. I added in uint32 pointers to ->data for addresses 0x1c12, subindex 0 and 2, and address 0x1601 subindex 0.
Rewriting SDO1601 subindex 0 to my desired length then works. However, if I do not write the config (from within my modified slaveinfo) the defaults will not be set from the object dictionary.
Do I have to write the defaults from the object dictionary value into the ->data fields myself?
At the moment I have to run slaveinfo twice in order to get the config to correctly write.
This is the output of the first slaveinfo:
./slaveinfo enp3s0 -map -sdo
SOEM (Simple Open EtherCAT Master)
Slaveinfo
Starting slaveinfo
ec_init on enp3s0 succeeded.
Read at 0x1c12:0 => wkc: 1; data: 0x0 (0) [rxPDO:0]
Read at 0x1c12:2 => wkc: 1; data: 0x00 (0) [rxPDO:2]
Read at 0x1601:0 => wkc: 1; data: 0x0 (0) [rxPDO:2]
Writing config.
Write at 0x1c12:0 => wkc: 1; data: 0x0 {clear SM PDO}
Write at 0x1601:0 => wkc: 1; data: 0x0 {clear RX PDO}
Write at 0x1601:0 => wkc: 1; data: 0x8 {Set num PDO entries}
Write at 0x1c12:2 => wkc: 1; data: 0x1601 {list entries in smpdo}
Write at 0x1c12:0 => wkc: 1; data: 0x2 {Set num PDOs}
Read at 0x1c12:0 => wkc: 1; data: 0x2 (2) [rxPDO:0]
Read at 0x1c12:2 => wkc: 1; data: 0x1601 (5633) [rxPDO:2]
Read at 0x1601:0 => wkc: 1; data: 0x8 (8) [rxPDO:2]
1 slaves found and configured.
Calculated workcounter 1
Not all slaves reached safe operational state.
Slave 1 State=12 StatusCode= 1d : Invalid output configuration
Slave:1
Name:arb_slaves
Output size: 0bits
Input size: 192bits
State: 18
Delay: 0[ns]
Has DC: 1
DCParentport:0
Activeports:1.0.0.0
Configured address: 1001
Man: 00000a43 ID: 00001001 Rev: 00000000
SM0 A:1000 L: 128 F:00010026 Type:1
SM1 A:1080 L: 128 F:00010022 Type:2
SM2 A:1100 L: 0 F:00000024 Type:3
SM3 A:1900 L: 24 F:00010020 Type:4
FMMU0 Ls:00000000 Ll: 24 Lsb:0 Leb:7 Ps:1900 Psb:0 Ty:01 Act:01
FMMUfunc 0:1 1:0 2:0 3:0
MBX length wr: 128 rd: 128 MBX protocols : 04
CoE details: 13 FoE details: 00 EoE details: 00 SoE details: 00
Ebus current: 0[mA]
only LRD/LWR:0
PDO mapping according to CoE :
SM2 outputs
addr b index: sub bitl data_type name
[0xFF9E3DE0.0] 0x7000:0x01 0x20 UNSIGNED32 id0
[0xFF9E3DE4.0] 0x7000:0x02 0x20 UNSIGNED32 id1
[0xFF9E3DE8.0] 0x7000:0x03 0x20 UNSIGNED32 id2
[0xFF9E3DEC.0] 0x7000:0x04 0x20 UNSIGNED32 control
[0xFF9E3DF0.0] 0x7000:0x05 0x20 UNSIGNED32 fault
[0xFF9E3DF4.0] 0x7001:0x01 0x08 UNSIGNED8 dout0
[0xFF9E3DF5.0] 0x7001:0x02 0x08 UNSIGNED8 dout1
[0xFF9E3DF6.0] 0x7001:0x03 0x08 UNSIGNED8 dout2
[0xFF9E3DF7.0] 0x7001:0x04 0x08 UNSIGNED8 dout3
[0xFF9E3DF8.0] 0x7001:0x05 0x08 UNSIGNED8 dout4
[0xFF9E3DF9.0] 0x7001:0x06 0x08 UNSIGNED8 dout5
[0xFF9E3DFA.0] 0x7001:0x07 0x08 UNSIGNED8 dout6
[0xFF9E3DFB.0] 0x7001:0x08 0x08 UNSIGNED8 dout7
SM3 inputs
addr b index: sub bitl data_type name
[0x0000.0] 0x6000:0x01 0x20 UNSIGNED32 status
[0x0004.0] 0x6000:0x02 0x20 UNSIGNED32 fault
[0x0008.0] 0x6001:0x01 0x08 UNSIGNED8 din0
[0x0009.0] 0x6001:0x02 0x08 UNSIGNED8 din1
[0x000A.0] 0x6001:0x03 0x08 UNSIGNED8 din2
[0x000B.0] 0x6001:0x04 0x08 UNSIGNED8 din3
[0x000C.0] 0x6001:0x05 0x08 UNSIGNED8 din4
[0x000D.0] 0x6001:0x06 0x08 UNSIGNED8 din5
[0x000E.0] 0x6001:0x07 0x08 UNSIGNED8 din6
[0x000F.0] 0x6001:0x08 0x08 UNSIGNED8 din7
[0x0010.0] 0x6001:0x09 0x08 UNSIGNED8 din8
[0x0011.0] 0x6001:0x0A 0x08 UNSIGNED8 din9
[0x0012.0] 0x6001:0x0B 0x08 UNSIGNED8 din10
[0x0013.0] 0x6001:0x0C 0x08 UNSIGNED8 din11
[0x0014.0] 0x6001:0x0D 0x08 UNSIGNED8 din12
[0x0015.0] 0x6001:0x0E 0x08 UNSIGNED8 din13
[0x0016.0] 0x6001:0x0F 0x08 UNSIGNED8 din14
[0x0017.0] 0x6001:0x10 0x08 UNSIGNED8 din15
End slaveinfo, close socket
End program
And this is the output when I immediately run it again:
./slaveinfo enp3s0 -map -sdo
SOEM (Simple Open EtherCAT Master)
Slaveinfo
Starting slaveinfo
ec_init on enp3s0 succeeded.
Read at 0x1c12:0 => wkc: 1; data: 0x2 (2) [rxPDO:0]
Read at 0x1c12:2 => wkc: 1; data: 0x1601 (5633) [rxPDO:2]
Read at 0x1601:0 => wkc: 1; data: 0x8 (8) [rxPDO:2]
Writing config.
Write at 0x1c12:0 => wkc: 1; data: 0x0 {clear SM PDO}
Write at 0x1601:0 => wkc: 1; data: 0x0 {clear RX PDO}
Write at 0x1601:0 => wkc: 1; data: 0x8 {Set num PDO entries}
Write at 0x1c12:2 => wkc: 1; data: 0x1601 {list entries in smpdo}
Write at 0x1c12:0 => wkc: 1; data: 0x2 {Set num PDOs}
Read at 0x1c12:0 => wkc: 1; data: 0x2 (2) [rxPDO:0]
Read at 0x1c12:2 => wkc: 1; data: 0x1601 (5633) [rxPDO:2]
Read at 0x1601:0 => wkc: 1; data: 0x8 (8) [rxPDO:2]
1 slaves found and configured.
Calculated workcounter 3
Slave:1
Name:arb_slaves
Output size: 224bits
Input size: 192bits
State: 4
Delay: 0[ns]
Has DC: 1
DCParentport:0
Activeports:1.0.0.0
Configured address: 1001
Man: 00000a43 ID: 00001001 Rev: 00000000
SM0 A:1000 L: 128 F:00010026 Type:1
SM1 A:1080 L: 128 F:00010022 Type:2
SM2 A:1100 L: 28 F:00010024 Type:3
SM3 A:1900 L: 24 F:00010020 Type:4
FMMU0 Ls:00000000 Ll: 28 Lsb:0 Leb:7 Ps:1100 Psb:0 Ty:02 Act:01
FMMU1 Ls:0000001c Ll: 24 Lsb:0 Leb:7 Ps:1900 Psb:0 Ty:01 Act:01
FMMUfunc 0:1 1:0 2:0 3:0
MBX length wr: 128 rd: 128 MBX protocols : 04
CoE details: 13 FoE details: 00 EoE details: 00 SoE details: 00
Ebus current: 0[mA]
only LRD/LWR:0
PDO mapping according to CoE :
SM2 outputs
addr b index: sub bitl data_type name
[0x0000.0] 0x7000:0x01 0x20 UNSIGNED32 id0
[0x0004.0] 0x7000:0x02 0x20 UNSIGNED32 id1
[0x0008.0] 0x7000:0x03 0x20 UNSIGNED32 id2
[0x000C.0] 0x7000:0x04 0x20 UNSIGNED32 control
[0x0010.0] 0x7000:0x05 0x20 UNSIGNED32 fault
[0x0014.0] 0x7001:0x01 0x08 UNSIGNED8 dout0
[0x0015.0] 0x7001:0x02 0x08 UNSIGNED8 dout1
[0x0016.0] 0x7001:0x03 0x08 UNSIGNED8 dout2
[0x0017.0] 0x7001:0x04 0x08 UNSIGNED8 dout3
[0x0018.0] 0x7001:0x05 0x08 UNSIGNED8 dout4
[0x0019.0] 0x7001:0x06 0x08 UNSIGNED8 dout5
[0x001A.0] 0x7001:0x07 0x08 UNSIGNED8 dout6
[0x001B.0] 0x7001:0x08 0x08 UNSIGNED8 dout7
SM3 inputs
addr b index: sub bitl data_type name
[0x001C.0] 0x6000:0x01 0x20 UNSIGNED32 status
[0x0020.0] 0x6000:0x02 0x20 UNSIGNED32 fault
[0x0024.0] 0x6001:0x01 0x08 UNSIGNED8 din0
[0x0025.0] 0x6001:0x02 0x08 UNSIGNED8 din1
[0x0026.0] 0x6001:0x03 0x08 UNSIGNED8 din2
[0x0027.0] 0x6001:0x04 0x08 UNSIGNED8 din3
[0x0028.0] 0x6001:0x05 0x08 UNSIGNED8 din4
[0x0029.0] 0x6001:0x06 0x08 UNSIGNED8 din5
[0x002A.0] 0x6001:0x07 0x08 UNSIGNED8 din6
[0x002B.0] 0x6001:0x08 0x08 UNSIGNED8 din7
[0x002C.0] 0x6001:0x09 0x08 UNSIGNED8 din8
[0x002D.0] 0x6001:0x0A 0x08 UNSIGNED8 din9
[0x002E.0] 0x6001:0x0B 0x08 UNSIGNED8 din10
[0x002F.0] 0x6001:0x0C 0x08 UNSIGNED8 din11
[0x0030.0] 0x6001:0x0D 0x08 UNSIGNED8 din12
[0x0031.0] 0x6001:0x0E 0x08 UNSIGNED8 din13
[0x0032.0] 0x6001:0x0F 0x08 UNSIGNED8 din14
[0x0033.0] 0x6001:0x10 0x08 UNSIGNED8 din15
End slaveinfo, close socket
End program
The second output is the desired result!
Can you offer any more advice on setting this up correctly?
Another possible issue:
sizeOfPDO line 231
l = (uint8_t) objd->value;
does not check to see if we are taking the number of entries in (say 0x1601) from data - where they could have been dynamically set.
I altered this line to look to see if the number of entries might have been dynamically set:
if (objd->data) {
l = *( (uint8_t*) objd->data );
} else {
l = (uint8_t) objd->value;
}
I'll also make note to ensure the rest of my slave is conformant!
Thanks again for your help
from soes.
Do you have a fork or something?
The issue is most likely that the size don’t match and since the second try works you need to trigger a sizeofPDO?
We’ve an upcoming release with dynamic configuration of 1C12, 1C13 in the loop, PdoAssign. Can’t give you a date yet but will try to prepare a fork.
from soes.
No, no fork I'm afraid.
All this is based off the Git repo as of about a week ago, with basically no modification, except for what we have discussed.
sizeofPDO is being called after any write to 0x1c12 sub 0 in the objecthandler and its also being called at initialisation.
At boot up, if I do not write anything from the master and only rely on the slave to initialise, I get a slaveinfo output as in the first output dump in my last message.
I suspect initialisation data is not being taken from value (in the const object dictionary) and put into the data fields (When setting a uint32* to ->data).
I see the function initDefaultSyncMgrPara in esc_coe actually goes through and initialises from value to ->data (if data != NULL), but only for 1C3x and 10F1.
Would it be worth extending this (or creating a new function) to do something similar for 1c12 and 1c13 etc?
Upcoming release sounds great!
Thanks for your help
from soes.
That’s correct , I’ve added load PDO default.
from soes.
I’ve added load PDO default.
Is this something I can take a look at?
from soes.
I looked into this some more and wrote a function to load PDO defaults.
Pretty quickly written and almost directly taken from COE_initDefaultSyncMgrPara.
It looks like it works ok, but it may not be completely correct in the SOES scheme of things.
Also, I still had to keep the modification to sizeOfPDO line 231 I mentioned earlier.
void initDefaultPDO (void)
{
uint32_t i,j;
const _objd *objd;
const _objd *objsub;
int32_t n = 0;
int32_t addr = 0;
/* 1C1x */
for(i = 0x1C12; i <= 0x1C13; i ++)
{
/* Look if index is present */
n = SDO_findobject(i);
if(n < 0)
{
continue;
}
/* Load default values */
objd = SDOobjects[n].objdesc;
for(j = 0; j <= SDOobjects[n].maxsub; j++ )
{
if(objd[j].data != NULL)
{
*(uint32_t *)objd[j].data = objd[j].value;
}
/* Get the address it maps to and set it's default number of entries */
if (j > 0) {
addr = SDO_findobject(objd[j].value);
if (addr < 0) {
continue;
}
objsub = SDOobjects[addr].objdesc;
if(objsub[0].data != NULL)
{
*(uint32_t *)objsub[0].data = objsub[0].value;
}
}
if(objd[j].subindex >= SDOobjects[n].maxsub)
{
break;
}
}
}
}
from soes.
I tried to minimize the duplication of code and did some refactoring, if you do your own temp adoptions it shouldn’t matter that much in the end when we commit our solution.
We have also considered the dynamic No of subindexes in sizeof fore 1C1x.
In addition I’ve added an update data of the PDO mapping on reconfiguration of 1C1x.
from soes.
I've added an Alpha to my fork, https://github.com/nakarlsson/SOES
from soes.
Hiya,
I gave your fork a go - So far its working well!
I found:
In esc_coe.h is
void COE_initSDODefault (uint16_t index);
declared incorrectly? Should it be:
void COE_initSDODefaultValue (uint16_t index);
Also, I'm aiming to set the number of variables to return in my PDOs (mentioned in my first message).
To do this I'm writing the number of values I want to (eg) 0x1601, sub index 2.
I found that I had to call COE_initSDODefaultValue(0x1601) after COE_initDefaultPDO() in the slave init function, before I calculated the PDO size.
It looks like if I had 0x1601(subindex 2) as a uint32* to ->data in the object dictionary, COE_initDefaultPDO() would not copy the default value to the uint32* and the size would be calculated incorrectly.
Thanks again!
from soes.
Can you post your ObjectDictionary?
from soes.
Here you go:
arb_arr_objectlist.c.txt
Note: I have the directions of my intended data flows backwards. For the sake of testing it's fine, but how embarrassing....
from soes.
It actually make sense to also default the SDOs in 1C12 and 1C13, check my updated fork.
I did 2 squash/commits and forced a push so you might wanna re-clone the fork
https://github.com/nakarlsson/SOES
I hope this solves the issue on 0x1601 not getting default data set
from soes.
Handled by SOES v3
from soes.
Related Issues (20)
- Issue with Changing Variable Type in seos-demo RaspberryPi-lan9252 Application HOT 2
- Inconsistent SPI Transmission with Sudden Jumps in Value HOT 3
- can you write a demo for lan9253 HOT 1
- can you write a demo for stm32 + ax58100 HOT 2
- can you give I demo for lan8720?
- LAN9252 EtherCAT Slave Projects HOT 2
- Does the EtherCAT slave ESC process messages in store-and-forward mode? HOT 8
- Wildcards in foe filenames HOT 3
- Use SDO to achieve Req and answer method
- Complete Access of object type Variable fails
- initialization and configuration HOT 1
- Race condition on repeat request and repeat ack
- Initialization problems
- Incorrect State Initialization in FOE for Large File Transfers HOT 1
- FOE write and read for different files HOT 1
- Add SM enable/disable readback that bit is enabled/disabled
- Update SOES versions in SOES/CMakeLists.txt
- Improve emulated EEPROM reload handling
- linux spi read write error HOT 1
- Entirely simulated slave device under Linux HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from soes.