blob: 61770e2843294345fb9cc546b785f5e5170a1f15 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
diff -ru SOEM/soem/ethercatcoe.c SOEM-fixed/soem/ethercatcoe.c
--- SOEM/soem/ethercatcoe.c 2022-03-08 10:24:11.535282886 +0800
+++ SOEM-fixed/soem/ethercatcoe.c 2022-03-08 11:06:40.655327076 +0800
@@ -688,6 +688,12 @@
/* number of available sub indexes */
nidx = rdat;
bsize = 0;
+ // check for some buggy devices
+ if (context->slavelist[Slave].eep_man == 0x00000D37 && context->slavelist[Slave].eep_id == 0x0C710004 && context->slavelist[Slave].eep_rev == 0x00000002) {
+ if (nidx == 0x48) {
+ return 16;
+ }
+ }
/* read all PDO's */
for (idxloop = 1; idxloop <= nidx; idxloop++)
{
@@ -696,6 +702,31 @@
wkc = ecx_SDOread(context, Slave, PDOassign, (uint8)idxloop, FALSE, &rdl, &rdat, EC_TIMEOUTRXM);
/* result is index of PDO */
idx = etohs(rdat);
+ // check for some buggy devices
+ if (context->slavelist[Slave].eep_man == 0x00000D37 && context->slavelist[Slave].eep_id == 0x0C710004 && context->slavelist[Slave].eep_rev == 0x00000002) {
+ switch (idx) {
+ case 0x1600:
+ case 0x1A00:
+ bsize += 16;
+ break;
+ case 0x1601:
+ case 0x1603:
+ case 0x1A01:
+ case 0x1A02:
+ bsize += 32;
+ break;
+ case 0x1605:
+ bsize += 64;
+ break;
+ case 0x1A04:
+ case 0x1A06:
+ bsize += 128;
+ break;
+ default:
+ break;
+ }
+ continue;
+ }
if (idx > 0)
{
rdl = sizeof(subcnt); subcnt = 0;
|