Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
E
etherlabmaster
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Jira
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
ICS Control System Infrastructure
etherlabmaster
Commits
5d786d13
Commit
5d786d13
authored
17 years ago
by
Florian Pose
Browse files
Options
Downloads
Patches
Plain Diff
Cleaned up Pdo mapping and configuration state machines.
parent
6f0241e5
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
master/fsm_mapping.c
+47
-38
47 additions, 38 deletions
master/fsm_mapping.c
master/fsm_mapping.h
+9
-10
9 additions, 10 deletions
master/fsm_mapping.h
master/fsm_pdo_config.c
+11
-10
11 additions, 10 deletions
master/fsm_pdo_config.c
master/fsm_pdo_config.h
+3
-4
3 additions, 4 deletions
master/fsm_pdo_config.h
with
70 additions
and
62 deletions
master/fsm_mapping.c
+
47
−
38
View file @
5d786d13
...
...
@@ -150,7 +150,7 @@ void ec_fsm_mapping_state_start(
return
;
}
fsm
->
dir
=
EC_DIR_OUTPUT
;
fsm
->
sync
=
NULL
;
ec_fsm_mapping_next_sync
(
fsm
);
}
...
...
@@ -162,31 +162,38 @@ void ec_fsm_mapping_next_sync(
ec_fsm_mapping_t
*
fsm
/**< mapping state machine */
)
{
while
(
1
)
{
if
(
fsm
->
dir
>
EC_DIR_INPUT
)
{
// no more directions to configure mappings for
fsm
->
state
=
ec_fsm_mapping_state_end
;
return
;
}
ec_direction_t
dir
;
const
ec_sync_t
*
sync
;
const
ec_pdo_mapping_t
*
map
;
if
(
!
(
fsm
->
sync
=
ec_slave_get_pdo_sync
(
fsm
->
slave
,
fsm
->
dir
))
)
{
EC_WARN
(
"next_sync(): No sync manager!
\n
"
);
fsm
->
dir
++
;
for
(
dir
=
EC_DIR_OUTPUT
;
dir
<=
EC_DIR_INPUT
;
dir
++
)
{
if
(
!
(
sync
=
ec_slave_get_pdo_sync
(
fsm
->
slave
,
dir
)))
{
EC_WARN
(
"No sync manager for direction %u!
\n
"
,
dir
)
;
continue
;
}
fsm
->
mapping
=
&
fsm
->
slave
->
config
->
mapping
[
fsm
->
dir
];
if
(
ec_pdo_mapping_equal
(
&
fsm
->
sync
->
mapping
,
fsm
->
mapping
))
{
// the mapping for this direction does not have to be altered
fsm
->
dir
++
;
continue
;
if
(
fsm
->
sync
)
{
// there is a last SM
if
(
sync
==
fsm
->
sync
)
// this is the last SM
fsm
->
sync
=
NULL
;
// take the next one
}
else
{
fsm
->
dir
++
;
map
=
&
fsm
->
slave
->
config
->
mapping
[
dir
];
if
(
ec_pdo_mapping_equal
(
&
sync
->
mapping
,
map
))
continue
;
fsm
->
sync
=
sync
;
fsm
->
mapping
=
map
;
break
;
}
}
if
(
!
sync
)
{
if
(
fsm
->
slave
->
master
->
debug_level
)
EC_DBG
(
"Pdo mapping finished for slave %u.
\n
"
,
fsm
->
slave
->
ring_position
);
fsm
->
state
=
ec_fsm_mapping_state_end
;
return
;
}
if
(
fsm
->
slave
->
master
->
debug_level
)
{
EC_DBG
(
"Configuring PDO mapping for SM%u of slave %u.
\n
"
,
fsm
->
sync
->
index
,
fsm
->
slave
->
ring_position
);
...
...
@@ -222,6 +229,27 @@ ec_pdo_t *ec_fsm_mapping_next_pdo(
/*****************************************************************************/
/** Add a Pdo to the mapping.
*/
void
ec_fsm_mapping_add_pdo
(
ec_fsm_mapping_t
*
fsm
/**< mapping state machine */
)
{
fsm
->
sdodata
.
subindex
=
fsm
->
pdo_count
;
EC_WRITE_U16
(
&
fsm
->
sdo_value
,
fsm
->
pdo
->
index
);
fsm
->
sdodata
.
size
=
2
;
if
(
fsm
->
slave
->
master
->
debug_level
)
EC_DBG
(
"Mapping PDO 0x%04X at position %u.
\n
"
,
fsm
->
pdo
->
index
,
fsm
->
sdodata
.
subindex
);
fsm
->
state
=
ec_fsm_mapping_state_add_pdo
;
ec_fsm_coe_download
(
fsm
->
fsm_coe
,
fsm
->
slave
,
&
fsm
->
sdodata
);
ec_fsm_coe_exec
(
fsm
->
fsm_coe
);
// execute immediately
}
/*****************************************************************************/
/** Set the number of mapped PDOs to zero.
*/
void
ec_fsm_mapping_state_zero_count
(
...
...
@@ -250,17 +278,7 @@ void ec_fsm_mapping_state_zero_count(
// add first PDO to mapping
fsm
->
pdo_count
=
1
;
fsm
->
sdodata
.
subindex
=
fsm
->
pdo_count
;
EC_WRITE_U16
(
&
fsm
->
sdo_value
,
fsm
->
pdo
->
index
);
fsm
->
sdodata
.
size
=
2
;
if
(
fsm
->
slave
->
master
->
debug_level
)
EC_DBG
(
"Mapping PDO 0x%04X at position %u.
\n
"
,
fsm
->
pdo
->
index
,
fsm
->
sdodata
.
subindex
);
fsm
->
state
=
ec_fsm_mapping_state_add_pdo
;
ec_fsm_coe_download
(
fsm
->
fsm_coe
,
fsm
->
slave
,
&
fsm
->
sdodata
);
ec_fsm_coe_exec
(
fsm
->
fsm_coe
);
// execute immediately
ec_fsm_mapping_add_pdo
(
fsm
);
}
/*****************************************************************************/
...
...
@@ -299,16 +317,7 @@ void ec_fsm_mapping_state_add_pdo(
// add next PDO to mapping
fsm
->
pdo_count
++
;
fsm
->
sdodata
.
subindex
=
fsm
->
pdo_count
;
EC_WRITE_U16
(
&
fsm
->
sdo_value
,
fsm
->
pdo
->
index
);
fsm
->
sdodata
.
size
=
2
;
if
(
fsm
->
slave
->
master
->
debug_level
)
EC_DBG
(
"Mapping PDO 0x%04X at position %u.
\n
"
,
fsm
->
pdo
->
index
,
fsm
->
sdodata
.
subindex
);
ec_fsm_coe_download
(
fsm
->
fsm_coe
,
fsm
->
slave
,
&
fsm
->
sdodata
);
ec_fsm_coe_exec
(
fsm
->
fsm_coe
);
// execute immediately
ec_fsm_mapping_add_pdo
(
fsm
);
}
/*****************************************************************************/
...
...
This diff is collapsed.
Click to expand it.
master/fsm_mapping.h
+
9
−
10
View file @
5d786d13
...
...
@@ -54,18 +54,17 @@ typedef struct ec_fsm_mapping ec_fsm_mapping_t; /**< \see ec_fsm_mapping */
*/
struct
ec_fsm_mapping
{
void
(
*
state
)(
ec_fsm_mapping_t
*
);
/**< state function */
ec_fsm_coe_t
*
fsm_coe
;
/**< CoE state machine to use */
void
(
*
state
)(
ec_fsm_mapping_t
*
);
/**< State function. */
ec_fsm_coe_t
*
fsm_coe
;
/**< CoE state machine to use. */
ec_slave_t
*
slave
;
/**< Slave the FSM runs on. */
ec_slave_t
*
slave
;
/**< slave the FSM runs on */
const
ec_sync_t
*
sync
;
/**< Current sync manager. */
const
ec_pdo_mapping_t
*
mapping
;
/**< Target Pdo mapping. */
const
ec_pdo_t
*
pdo
;
/**< Current Pdo. */
ec_direction_t
dir
;
/**< current PDO direction */
ec_sync_t
*
sync
;
/**< current sync manager */
const
ec_pdo_mapping_t
*
mapping
;
/**< Mapping to assign. */
ec_pdo_t
*
pdo
;
/**< current PDO */
ec_sdo_data_t
sdodata
;
/**< SDO configuration data */
uint16_t
sdo_value
;
/**< SDO value */
unsigned
int
pdo_count
;
/**< number of mapped PDOs */
ec_sdo_data_t
sdodata
;
/**< SDO configuration data. */
uint16_t
sdo_value
;
/**< SDO value. */
unsigned
int
pdo_count
;
/**< Number of mapped Pdos. */
};
/*****************************************************************************/
...
...
This diff is collapsed.
Click to expand it.
master/fsm_pdo_config.c
+
11
−
10
View file @
5d786d13
...
...
@@ -167,27 +167,28 @@ void ec_fsm_pdo_config_next_pdo(
map
=
&
fsm
->
slave
->
config
->
mapping
[
dir
];
list_for_each_entry
(
pdo
,
&
map
->
pdos
,
list
)
{
if
(
fsm
->
pdo
)
{
if
(
pdo
==
fsm
->
pdo
)
fsm
->
pdo
=
NULL
;
if
(
fsm
->
pdo
)
{
// there was a Pdo configured in the last run
if
(
pdo
==
fsm
->
pdo
)
// this is the last Pdo
fsm
->
pdo
=
NULL
;
// take the next one
}
else
{
if
((
mapped_pdo
=
ec_slave_find_pdo
(
fsm
->
slave
,
pdo
->
index
)))
if
(
ec_pdo_equal_entries
(
pdo
,
mapped_pdo
))
continue
;
// Pdo configured correctly
fsm
->
pdo
=
pdo
;
goto
configure
;
break
;
}
}
}
if
(
fsm
->
slave
->
master
->
debug_level
)
EC_DBG
(
"Pdo configuration finished for slave %u.
\n
"
,
fsm
->
slave
->
ring_position
);
fsm
->
state
=
ec_fsm_pdo_config_state_end
;
return
;
if
(
!
fsm
->
pdo
)
{
if
(
fsm
->
slave
->
master
->
debug_level
)
EC_DBG
(
"Pdo configuration finished for slave %u.
\n
"
,
fsm
->
slave
->
ring_position
);
fsm
->
state
=
ec_fsm_pdo_config_state_end
;
return
;
}
configure:
if
(
fsm
->
slave
->
master
->
debug_level
)
{
EC_DBG
(
"Changing configuration of Pdo 0x%04X of slave %u.
\n
"
,
fsm
->
pdo
->
index
,
fsm
->
slave
->
ring_position
);
...
...
This diff is collapsed.
Click to expand it.
master/fsm_pdo_config.h
+
3
−
4
View file @
5d786d13
...
...
@@ -31,10 +31,9 @@
*
*****************************************************************************/
/**
\file
EtherCAT PDO configuration state machine structures.
*/
/** \file
* EtherCAT PDO configuration state machine structures.
*/
/*****************************************************************************/
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment