Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
P
proview
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Esteban Blanc
proview
Commits
ec6c4107
Commit
ec6c4107
authored
Jul 16, 2019
by
Marcus Nordenberg
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Profinet: Subslot fix
parent
219de194
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
657 additions
and
473 deletions
+657
-473
profibus/lib/rt/src/rt_pn_iface.cpp
profibus/lib/rt/src/rt_pn_iface.cpp
+657
-473
No files found.
profibus/lib/rt/src/rt_pn_iface.cpp
View file @
ec6c4107
...
@@ -75,16 +75,16 @@
...
@@ -75,16 +75,16 @@
#define _HIGH_LOW_BYTES_TO_PN_U16(High, Low) \
#define _HIGH_LOW_BYTES_TO_PN_U16(High, Low) \
((PN_U16)((((PN_U16)(High)) << 8) + (Low)))
((PN_U16)((((PN_U16)(High)) << 8) + (Low)))
#define _HIGH_LOW_BYTES_TO_PN_U32(hwhb, hwlb, lwhb, lwlb) \
#define _HIGH_LOW_BYTES_TO_PN_U32(hwhb, hwlb, lwhb, lwlb) \
((PN_U32)((((PN_U32)(hwhb)) << 24) + (((PN_U32)(hwlb)) << 16)
\
((PN_U32)((((PN_U32)(hwhb)) << 24) + (((PN_U32)(hwlb)) << 16)
+
\
+
(((PN_U32)(lwhb)) << 8) + (lwlb)))
(((PN_U32)(lwhb)) << 8) + (lwlb)))
char
file_vect
[
2
][
80
]
=
{
char
file_vect
[
2
][
80
]
=
{
"pwr_pn_000_001_099_020_000000a2.xml"
,
"pwr_pn_000_001_099_020_000000a2.xml"
,
"pwr_pn_000_001_099_020_000000e5.xml"
,
"pwr_pn_000_001_099_020_000000e5.xml"
,
};
};
void
pack_set_ip_settings_req
(
void
pack_set_ip_settings_req
(
T_PNAK_SERVICE_REQ_RES
*
ServiceReqRes
,
T_PNAK_SERVICE_REQ_RES
*
ServiceReqRes
,
PnDeviceInfo
*
dev_info
)
PnDeviceInfo
*
dev_info
)
{
{
T_PNAK_SERVICE_DESCRIPTION
*
service_desc
;
T_PNAK_SERVICE_DESCRIPTION
*
service_desc
;
T_PN_SERVICE_SET_IP_SETTINGS_REQ
*
pSISR
;
T_PN_SERVICE_SET_IP_SETTINGS_REQ
*
pSISR
;
...
@@ -94,8 +94,8 @@ void pack_set_ip_settings_req(
...
@@ -94,8 +94,8 @@ void pack_set_ip_settings_req(
ServiceReqRes
->
NumberEntries
=
1
;
ServiceReqRes
->
NumberEntries
=
1
;
ServiceReqRes
->
ServiceEntry
[
0
].
ServiceOffset
=
0
;
ServiceReqRes
->
ServiceEntry
[
0
].
ServiceOffset
=
0
;
service_desc
service_desc
=
=
(
T_PNAK_SERVICE_DESCRIPTION
*
)
&
ServiceReqRes
->
ServiceChannel
[
offset
];
(
T_PNAK_SERVICE_DESCRIPTION
*
)
&
ServiceReqRes
->
ServiceChannel
[
offset
];
service_desc
->
DeviceRef
=
0u
;
service_desc
->
DeviceRef
=
0u
;
service_desc
->
Instance
=
PN_SUPERVISOR
;
service_desc
->
Instance
=
PN_SUPERVISOR
;
...
@@ -139,8 +139,8 @@ void pack_set_ip_settings_req(
...
@@ -139,8 +139,8 @@ void pack_set_ip_settings_req(
pSISR
->
SubnetMaskLowWordHighByte
=
dev_info
->
subnetmask
[
1
];
pSISR
->
SubnetMaskLowWordHighByte
=
dev_info
->
subnetmask
[
1
];
pSISR
->
SubnetMaskLowWordLowByte
=
dev_info
->
subnetmask
[
0
];
pSISR
->
SubnetMaskLowWordLowByte
=
dev_info
->
subnetmask
[
0
];
}
}
void
pack_set_device_name_req
(
void
pack_set_device_name_req
(
T_PNAK_SERVICE_REQ_RES
*
ServiceReqRes
,
T_PNAK_SERVICE_REQ_RES
*
ServiceReqRes
,
PnDeviceInfo
*
dev_info
)
PnDeviceInfo
*
dev_info
)
{
{
T_PNAK_SERVICE_DESCRIPTION
*
service_desc
;
T_PNAK_SERVICE_DESCRIPTION
*
service_desc
;
T_PN_SERVICE_SET_NAME_REQ
*
pSNR
;
T_PN_SERVICE_SET_NAME_REQ
*
pSNR
;
...
@@ -151,8 +151,8 @@ void pack_set_device_name_req(
...
@@ -151,8 +151,8 @@ void pack_set_device_name_req(
ServiceReqRes
->
NumberEntries
=
1
;
ServiceReqRes
->
NumberEntries
=
1
;
ServiceReqRes
->
ServiceEntry
[
0
].
ServiceOffset
=
0
;
ServiceReqRes
->
ServiceEntry
[
0
].
ServiceOffset
=
0
;
service_desc
service_desc
=
=
(
T_PNAK_SERVICE_DESCRIPTION
*
)
&
ServiceReqRes
->
ServiceChannel
[
offset
];
(
T_PNAK_SERVICE_DESCRIPTION
*
)
&
ServiceReqRes
->
ServiceChannel
[
offset
];
service_desc
->
DeviceRef
=
0u
;
service_desc
->
DeviceRef
=
0u
;
service_desc
->
Instance
=
PN_SUPERVISOR
;
service_desc
->
Instance
=
PN_SUPERVISOR
;
...
@@ -194,8 +194,8 @@ void pack_set_identification_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes)
...
@@ -194,8 +194,8 @@ void pack_set_identification_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes)
ServiceReqRes
->
NumberEntries
=
1
;
ServiceReqRes
->
NumberEntries
=
1
;
ServiceReqRes
->
ServiceEntry
[
0
].
ServiceOffset
=
0
;
ServiceReqRes
->
ServiceEntry
[
0
].
ServiceOffset
=
0
;
service_desc
service_desc
=
=
(
T_PNAK_SERVICE_DESCRIPTION
*
)
&
ServiceReqRes
->
ServiceChannel
[
offset
];
(
T_PNAK_SERVICE_DESCRIPTION
*
)
&
ServiceReqRes
->
ServiceChannel
[
offset
];
service_desc
->
DeviceRef
=
PN_DEVICE_REFERENCE_THIS_STATION
;
service_desc
->
DeviceRef
=
PN_DEVICE_REFERENCE_THIS_STATION
;
service_desc
->
Instance
=
PN
;
service_desc
->
Instance
=
PN
;
...
@@ -225,8 +225,8 @@ void pack_set_identification_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes)
...
@@ -225,8 +225,8 @@ void pack_set_identification_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes)
pSSIR
->
IdentAndMaintenanceVersionLowByte
=
1
;
pSSIR
->
IdentAndMaintenanceVersionLowByte
=
1
;
}
}
void
pack_get_device_state_req
(
void
pack_get_device_state_req
(
T_PNAK_SERVICE_REQ_RES
*
ServiceReqRes
,
T_PNAK_SERVICE_REQ_RES
*
ServiceReqRes
,
unsigned
short
device_ref
)
unsigned
short
device_ref
)
{
{
unsigned
offset
=
0u
;
unsigned
offset
=
0u
;
...
@@ -236,8 +236,8 @@ void pack_get_device_state_req(
...
@@ -236,8 +236,8 @@ void pack_get_device_state_req(
ServiceReqRes
->
NumberEntries
=
1
;
ServiceReqRes
->
NumberEntries
=
1
;
ServiceReqRes
->
ServiceEntry
[
0
].
ServiceOffset
=
0
;
ServiceReqRes
->
ServiceEntry
[
0
].
ServiceOffset
=
0
;
service_desc
service_desc
=
=
(
T_PNAK_SERVICE_DESCRIPTION
*
)
&
ServiceReqRes
->
ServiceChannel
[
offset
];
(
T_PNAK_SERVICE_DESCRIPTION
*
)
&
ServiceReqRes
->
ServiceChannel
[
offset
];
service_desc
->
DeviceRef
=
device_ref
;
service_desc
->
DeviceRef
=
device_ref
;
service_desc
->
Instance
=
PN_CONTROLLER
;
service_desc
->
Instance
=
PN_CONTROLLER
;
...
@@ -252,7 +252,7 @@ void pack_get_device_state_req(
...
@@ -252,7 +252,7 @@ void pack_get_device_state_req(
}
}
void
pack_write_req
(
T_PNAK_SERVICE_REQ_RES
*
ServiceReqRes
,
void
pack_write_req
(
T_PNAK_SERVICE_REQ_RES
*
ServiceReqRes
,
unsigned
short
device_ref
,
pwr_sClass_PnWriteReq
*
wr_req
)
unsigned
short
device_ref
,
pwr_sClass_PnWriteReq
*
wr_req
)
{
{
unsigned
offset
=
0u
;
unsigned
offset
=
0u
;
...
@@ -264,8 +264,8 @@ void pack_write_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -264,8 +264,8 @@ void pack_write_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
ServiceReqRes
->
NumberEntries
=
1
;
ServiceReqRes
->
NumberEntries
=
1
;
ServiceReqRes
->
ServiceEntry
[
0
].
ServiceOffset
=
0
;
ServiceReqRes
->
ServiceEntry
[
0
].
ServiceOffset
=
0
;
service_desc
service_desc
=
=
(
T_PNAK_SERVICE_DESCRIPTION
*
)
&
ServiceReqRes
->
ServiceChannel
[
offset
];
(
T_PNAK_SERVICE_DESCRIPTION
*
)
&
ServiceReqRes
->
ServiceChannel
[
offset
];
service_desc
->
DeviceRef
=
device_ref
;
service_desc
->
DeviceRef
=
device_ref
;
service_desc
->
Instance
=
PN_CONTROLLER
;
service_desc
->
Instance
=
PN_CONTROLLER
;
...
@@ -311,8 +311,8 @@ void pack_get_los_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes)
...
@@ -311,8 +311,8 @@ void pack_get_los_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes)
ServiceReqRes
->
NumberEntries
=
1
;
ServiceReqRes
->
NumberEntries
=
1
;
ServiceReqRes
->
ServiceEntry
[
0
].
ServiceOffset
=
0
;
ServiceReqRes
->
ServiceEntry
[
0
].
ServiceOffset
=
0
;
service_desc
service_desc
=
=
(
T_PNAK_SERVICE_DESCRIPTION
*
)
&
ServiceReqRes
->
ServiceChannel
[
offset
];
(
T_PNAK_SERVICE_DESCRIPTION
*
)
&
ServiceReqRes
->
ServiceChannel
[
offset
];
service_desc
->
DeviceRef
=
PN_DEVICE_REFERENCE_THIS_STATION
;
service_desc
->
DeviceRef
=
PN_DEVICE_REFERENCE_THIS_STATION
;
service_desc
->
Instance
=
PN_SUPERVISOR
;
service_desc
->
Instance
=
PN_SUPERVISOR
;
...
@@ -327,7 +327,7 @@ void pack_get_los_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes)
...
@@ -327,7 +327,7 @@ void pack_get_los_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes)
}
}
void
pack_get_alarm_req
(
T_PNAK_SERVICE_REQ_RES
*
ServiceReqRes
,
void
pack_get_alarm_req
(
T_PNAK_SERVICE_REQ_RES
*
ServiceReqRes
,
unsigned
short
ref
,
unsigned
short
device_ref
)
unsigned
short
ref
,
unsigned
short
device_ref
)
{
{
unsigned
offset
=
0u
;
unsigned
offset
=
0u
;
...
@@ -338,8 +338,8 @@ void pack_get_alarm_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -338,8 +338,8 @@ void pack_get_alarm_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
ServiceReqRes
->
NumberEntries
=
1
;
ServiceReqRes
->
NumberEntries
=
1
;
ServiceReqRes
->
ServiceEntry
[
0
].
ServiceOffset
=
0
;
ServiceReqRes
->
ServiceEntry
[
0
].
ServiceOffset
=
0
;
service_desc
service_desc
=
=
(
T_PNAK_SERVICE_DESCRIPTION
*
)
&
ServiceReqRes
->
ServiceChannel
[
offset
];
(
T_PNAK_SERVICE_DESCRIPTION
*
)
&
ServiceReqRes
->
ServiceChannel
[
offset
];
service_desc
->
DeviceRef
=
device_ref
;
service_desc
->
DeviceRef
=
device_ref
;
service_desc
->
Instance
=
PN
;
service_desc
->
Instance
=
PN
;
...
@@ -359,7 +359,8 @@ void pack_get_alarm_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -359,7 +359,8 @@ void pack_get_alarm_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
}
}
void
pack_alarm_ack_req
(
T_PNAK_SERVICE_REQ_RES
*
ServiceReqRes
,
void
pack_alarm_ack_req
(
T_PNAK_SERVICE_REQ_RES
*
ServiceReqRes
,
unsigned
short
ref
,
unsigned
short
prio
,
unsigned
short
device_ref
)
unsigned
short
ref
,
unsigned
short
prio
,
unsigned
short
device_ref
)
{
{
unsigned
offset
=
0u
;
unsigned
offset
=
0u
;
...
@@ -370,8 +371,8 @@ void pack_alarm_ack_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -370,8 +371,8 @@ void pack_alarm_ack_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
ServiceReqRes
->
NumberEntries
=
1
;
ServiceReqRes
->
NumberEntries
=
1
;
ServiceReqRes
->
ServiceEntry
[
0
].
ServiceOffset
=
0
;
ServiceReqRes
->
ServiceEntry
[
0
].
ServiceOffset
=
0
;
service_desc
service_desc
=
=
(
T_PNAK_SERVICE_DESCRIPTION
*
)
&
ServiceReqRes
->
ServiceChannel
[
offset
];
(
T_PNAK_SERVICE_DESCRIPTION
*
)
&
ServiceReqRes
->
ServiceChannel
[
offset
];
service_desc
->
DeviceRef
=
device_ref
;
service_desc
->
DeviceRef
=
device_ref
;
service_desc
->
Instance
=
PN
;
service_desc
->
Instance
=
PN
;
...
@@ -392,7 +393,7 @@ void pack_alarm_ack_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -392,7 +393,7 @@ void pack_alarm_ack_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
}
}
void
pack_download_req
(
T_PNAK_SERVICE_REQ_RES
*
ServiceReqRes
,
void
pack_download_req
(
T_PNAK_SERVICE_REQ_RES
*
ServiceReqRes
,
GsdmlDeviceData
*
dev_data
,
unsigned
short
device_ref
)
GsdmlDeviceData
*
dev_data
,
unsigned
short
device_ref
)
{
{
unsigned
offset
=
0u
;
unsigned
offset
=
0u
;
...
@@ -419,8 +420,8 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -419,8 +420,8 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
ServiceReqRes
->
NumberEntries
=
1
;
ServiceReqRes
->
NumberEntries
=
1
;
ServiceReqRes
->
ServiceEntry
[
0
].
ServiceOffset
=
0
;
ServiceReqRes
->
ServiceEntry
[
0
].
ServiceOffset
=
0
;
service_desc
service_desc
=
=
(
T_PNAK_SERVICE_DESCRIPTION
*
)
&
ServiceReqRes
->
ServiceChannel
[
offset
];
(
T_PNAK_SERVICE_DESCRIPTION
*
)
&
ServiceReqRes
->
ServiceChannel
[
offset
];
service_desc
->
DeviceRef
=
device_ref
;
service_desc
->
DeviceRef
=
device_ref
;
// service_desc->DeviceRef = PN_DEVICE_REFERENCE_THIS_STATION;
// service_desc->DeviceRef = PN_DEVICE_REFERENCE_THIS_STATION;
...
@@ -436,23 +437,29 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -436,23 +437,29 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
/* Calculate num modules */
/* Calculate num modules */
for
(
ii
=
0
;
ii
<
dev_data
->
slot_data
.
size
();
ii
++
)
{
for
(
ii
=
0
;
ii
<
dev_data
->
slot_data
.
size
();
ii
++
)
{
if
((
dev_data
->
slot_data
[
ii
]
->
module_enum_number
!=
0
)
||
(
ii
==
0
))
if
((
dev_data
->
slot_data
[
ii
]
->
module_enum_number
!=
0
)
||
(
ii
==
0
))
num_modules
++
;
num_modules
++
;
else
else
break
;
break
;
}
}
// Ignore Interface subslots as they break the device configuration
// Third time's a charm, only subslots up to 0x7FFF are included in the AR
for
(
ii
=
0
;
ii
<
num_modules
;
ii
++
)
{
// according to an old picture i found :)
for
(
std
::
vector
<
GsdmlSubslotData
*>::
iterator
it
for
(
ii
=
0
;
ii
<
num_modules
;
ii
++
)
=
dev_data
->
slot_data
[
ii
]
->
subslot_data
.
begin
();
{
it
!=
dev_data
->
slot_data
[
ii
]
->
subslot_data
.
end
();)
{
for
(
std
::
vector
<
GsdmlSubslotData
*>::
iterator
it
=
// Don't add expectedsubmoduleblock if there's no IOCR
dev_data
->
slot_data
[
ii
]
->
subslot_data
.
begin
();
if
((
*
it
)
->
data_record
.
empty
()
&&
((
*
it
)
->
io_input_length
==
0
&&
(
*
it
)
->
io_output_length
==
0
))
{
it
!=
dev_data
->
slot_data
[
ii
]
->
subslot_data
.
end
();)
{
if
((
*
it
)
->
subslot_number
>
0x7FFF
)
{
delete
*
it
;
delete
*
it
;
it
=
dev_data
->
slot_data
[
ii
]
->
subslot_data
.
erase
(
it
);
it
=
dev_data
->
slot_data
[
ii
]
->
subslot_data
.
erase
(
it
);
}
else
{
}
else
{
it
++
;
it
++
;
}
}
}
}
...
@@ -460,30 +467,39 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -460,30 +467,39 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
/* Calculate num apis */
/* Calculate num apis */
if
(
num_iocrs
>
0
)
{
if
(
num_iocrs
>
0
)
for
(
ii
=
0
;
ii
<
num_modules
;
ii
++
)
{
{
for
(
ii
=
0
;
ii
<
num_modules
;
ii
++
)
{
slot_api
=
PROFINET_DEFAULT_API
;
slot_api
=
PROFINET_DEFAULT_API
;
for
(
jj
=
0
;
jj
<
dev_data
->
slot_data
[
ii
]
->
subslot_data
.
size
();
jj
++
)
{
for
(
jj
=
0
;
jj
<
dev_data
->
slot_data
[
ii
]
->
subslot_data
.
size
();
jj
++
)
if
(
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
api
>
0
)
{
{
if
(
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
api
>
0
)
{
slot_api
=
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
api
;
slot_api
=
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
api
;
break
;
break
;
}
}
}
}
found
=
0
;
found
=
0
;
for
(
kk
=
0
;
kk
<
apis
.
size
();
kk
++
)
{
for
(
kk
=
0
;
kk
<
apis
.
size
();
kk
++
)
if
(
apis
[
kk
].
api
==
slot_api
)
{
{
if
(
apis
[
kk
].
api
==
slot_api
)
{
found
=
TRUE
;
found
=
TRUE
;
break
;
break
;
}
}
}
}
if
(
!
found
)
{
if
(
!
found
)
{
PnApiData
api
;
PnApiData
api
;
api
.
api
=
slot_api
;
api
.
api
=
slot_api
;
api
.
module_index
.
push_back
(
ii
);
api
.
module_index
.
push_back
(
ii
);
apis
.
push_back
(
api
);
apis
.
push_back
(
api
);
}
else
{
}
else
{
apis
[
kk
].
module_index
.
push_back
(
ii
);
apis
[
kk
].
module_index
.
push_back
(
ii
);
}
}
}
}
...
@@ -492,15 +508,18 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -492,15 +508,18 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
/* Calculate num sub modules */
/* Calculate num sub modules */
for
(
ii
=
0
;
ii
<
num_modules
;
ii
++
)
{
for
(
ii
=
0
;
ii
<
num_modules
;
ii
++
)
{
num_sm
=
dev_data
->
slot_data
[
ii
]
->
subslot_data
.
size
();
num_sm
=
dev_data
->
slot_data
[
ii
]
->
subslot_data
.
size
();
num_submodules
+=
num_sm
;
num_submodules
+=
num_sm
;
for
(
jj
=
0
;
jj
<
num_sm
;
jj
++
)
{
for
(
jj
=
0
;
jj
<
num_sm
;
jj
++
)
num_datarecords
{
+=
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
data_record
.
size
();
num_datarecords
+=
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
data_record
.
size
();
for
(
kk
=
0
;
for
(
kk
=
0
;
kk
<
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
data_record
.
size
();
kk
<
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
data_record
.
size
();
kk
++
)
{
kk
++
)
{
data_record_length
+=
dev_data
->
slot_data
[
ii
]
data_record_length
+=
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
subslot_data
[
jj
]
->
data_record
[
kk
]
->
data_record
[
kk
]
...
@@ -512,13 +531,13 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -512,13 +531,13 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
// printf("Number of submodules for this slave: %d\n", num_submodules);
// printf("Number of submodules for this slave: %d\n", num_submodules);
// printf("Data record size for slave: %d\n", data_record_length);
// printf("Data record size for slave: %d\n", data_record_length);
length
=
sizeof
(
T_PN_SERVICE_DOWNLOAD_REQ
)
+
num_iocrs
*
sizeof
(
T_PN_IOCR
)
length
=
sizeof
(
T_PN_SERVICE_DOWNLOAD_REQ
)
+
num_iocrs
*
sizeof
(
T_PN_IOCR
)
+
+
num_apis
*
sizeof
(
T_PN_API
)
+
num_modules
*
sizeof
(
T_PN_MODULE
)
num_apis
*
sizeof
(
T_PN_API
)
+
num_modules
*
sizeof
(
T_PN_MODULE
)
+
+
num_submodules
*
sizeof
(
T_PN_SUBMODULE
)
num_submodules
*
sizeof
(
T_PN_SUBMODULE
)
+
+
num_datarecords
*
sizeof
(
T_PN_DATA_RECORD
)
num_datarecords
*
sizeof
(
T_PN_DATA_RECORD
)
+
+
(
num_iocrs
*
num_apis
+
num_modules
+
num_datarecords
)
(
num_iocrs
*
num_apis
+
num_modules
+
num_datarecords
)
*
*
sizeof
(
T_PN_REFERENCE
)
sizeof
(
T_PN_REFERENCE
)
+
+
data_record_length
;
data_record_length
;
pData
=
(
char
*
)(
service_desc
+
1
);
pData
=
(
char
*
)(
service_desc
+
1
);
...
@@ -544,7 +563,8 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -544,7 +563,8 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
T_PN_REFERENCE
*
pDataRecordReference
;
T_PN_REFERENCE
*
pDataRecordReference
;
T_PN_DATA_RECORD
*
pDataRecord
;
T_PN_DATA_RECORD
*
pDataRecord
;
if
(
device_ref
==
1
)
{
if
(
device_ref
==
1
)
{
// printf("sizeof download-struct: %d\n",
// printf("sizeof download-struct: %d\n",
// sizeof(T_PN_SERVICE_DOWNLOAD_REQ));
// sizeof(T_PN_SERVICE_DOWNLOAD_REQ));
// printf("sizeof IOCR-struct: %d\n", sizeof(T_PN_IOCR));
// printf("sizeof IOCR-struct: %d\n", sizeof(T_PN_IOCR));
...
@@ -555,20 +575,24 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -555,20 +575,24 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
// printf("sizeof REFERENCE-struct: %d\n", sizeof(T_PN_REFERENCE));
// printf("sizeof REFERENCE-struct: %d\n", sizeof(T_PN_REFERENCE));
}
}
no_items
=
sscanf
(
dev_data
->
ip_address
,
"%hhi.%hhi.%hhi.%hhi"
,
no_items
=
&
high_high_byte
,
&
high_low_byte
,
&
low_high_byte
,
&
low_low_byte
);
sscanf
(
dev_data
->
ip_address
,
"%hhi.%hhi.%hhi.%hhi"
,
&
high_high_byte
,
&
high_low_byte
,
&
low_high_byte
,
&
low_low_byte
);
if
(
no_items
==
4
)
{
if
(
no_items
==
4
)
{
pSDR
->
IpAddressHighWordHighByte
=
high_high_byte
;
pSDR
->
IpAddressHighWordHighByte
=
high_high_byte
;
pSDR
->
IpAddressHighWordLowByte
=
high_low_byte
;
pSDR
->
IpAddressHighWordLowByte
=
high_low_byte
;
pSDR
->
IpAddressLowWordHighByte
=
low_high_byte
;
pSDR
->
IpAddressLowWordHighByte
=
low_high_byte
;
pSDR
->
IpAddressLowWordLowByte
=
low_low_byte
;
pSDR
->
IpAddressLowWordLowByte
=
low_low_byte
;
}
}
no_items
=
sscanf
(
dev_data
->
subnet_mask
,
"%hhi.%hhi.%hhi.%hhi"
,
no_items
=
&
high_high_byte
,
&
high_low_byte
,
&
low_high_byte
,
&
low_low_byte
);
sscanf
(
dev_data
->
subnet_mask
,
"%hhi.%hhi.%hhi.%hhi"
,
&
high_high_byte
,
&
high_low_byte
,
&
low_high_byte
,
&
low_low_byte
);
if
(
no_items
==
4
)
{
if
(
no_items
==
4
)
{
pSDR
->
SubnetMaskHighWordHighByte
=
high_high_byte
;
pSDR
->
SubnetMaskHighWordHighByte
=
high_high_byte
;
pSDR
->
SubnetMaskHighWordLowByte
=
high_low_byte
;
pSDR
->
SubnetMaskHighWordLowByte
=
high_low_byte
;
pSDR
->
SubnetMaskLowWordHighByte
=
low_high_byte
;
pSDR
->
SubnetMaskLowWordHighByte
=
low_high_byte
;
...
@@ -577,7 +601,8 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -577,7 +601,8 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
sprintf
(
pSDR
->
DeviceName
,
dev_data
->
device_name
);
sprintf
(
pSDR
->
DeviceName
,
dev_data
->
device_name
);
if
(
device_ref
==
PN_DEVICE_REFERENCE_THIS_STATION
)
{
if
(
device_ref
==
PN_DEVICE_REFERENCE_THIS_STATION
)
{
sprintf
(
pSDR
->
InterfaceName
,
dev_data
->
device_text
);
sprintf
(
pSDR
->
InterfaceName
,
dev_data
->
device_text
);
// pSDR->Flag = PN_SERVICE_DOWNLOAD_FLAG_ACTIVATE;
// pSDR->Flag = PN_SERVICE_DOWNLOAD_FLAG_ACTIVATE;
// PN_SERVICE_DOWNLOAD_FLAG_FULL_APPLICATION_IDENT_SUPPORT
// PN_SERVICE_DOWNLOAD_FLAG_FULL_APPLICATION_IDENT_SUPPORT
...
@@ -587,14 +612,16 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -587,14 +612,16 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
ar_property
=
0
;
ar_property
=
0
;
pSDR
->
InstanceLowByte
=
0
;
pSDR
->
InstanceLowByte
=
0
;
}
else
{
}
else
{
pSDR
->
Flag
=
PN_SERVICE_DOWNLOAD_FLAG_ACTIVATE
;
pSDR
->
Flag
=
PN_SERVICE_DOWNLOAD_FLAG_ACTIVATE
;
// pSDR->Flag = PN_SERVICE_DOWNLOAD_FLAG_DISABLE_DCP_HELLO |
// pSDR->Flag = PN_SERVICE_DOWNLOAD_FLAG_DISABLE_DCP_HELLO |
// PN_SERVICE_DOWNLOAD_FLAG_FULL_APPLICATION_IDENT_SUPPORT;
// PN_SERVICE_DOWNLOAD_FLAG_FULL_APPLICATION_IDENT_SUPPORT;
ar_property
=
PROFINET_AR_PROPERTY_STATE_PRIMARY
ar_property
=
PROFINET_AR_PROPERTY_STATE_PRIMARY
|
|
PROFINET_AR_PROPERTY_PARAMETER_SERVER_CM
PROFINET_AR_PROPERTY_PARAMETER_SERVER_CM
|
|
PROFINET_AR_PROPERTY_DATA_RATE_100MBIT
PROFINET_AR_PROPERTY_DATA_RATE_100MBIT
|
|
PROFINET_AR_PROPERTY_STARTUP_MODE_LEGACY
;
PROFINET_AR_PROPERTY_STARTUP_MODE_LEGACY
;
// pSDR->AdditionalFlag =
// pSDR->AdditionalFlag =
// PN_SERVICE_DOWNLOAD_ADD_FLAG_ENABLE_MULTIPLE_WRITE;
// PN_SERVICE_DOWNLOAD_ADD_FLAG_ENABLE_MULTIPLE_WRITE;
...
@@ -651,33 +678,35 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -651,33 +678,35 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
pIOCR
=
(
T_PN_IOCR
*
)(
pSDR
+
1
);
pIOCR
=
(
T_PN_IOCR
*
)(
pSDR
+
1
);
for
(
ii
=
0
;
ii
<
num_iocrs
;
ii
++
)
{
for
(
ii
=
0
;
ii
<
num_iocrs
;
ii
++
)
{
/* Fill data for IOCR */
/* Fill data for IOCR */
pIOCR
->
VersionHighByte
=
pSDR
->
VersionHighByte
;
pIOCR
->
VersionHighByte
=
pSDR
->
VersionHighByte
;
pIOCR
->
VersionLowByte
=
pSDR
->
VersionLowByte
;
pIOCR
->
VersionLowByte
=
pSDR
->
VersionLowByte
;
pIOCR
->
TypeHighByte
=
_PN_U16_HIGH_BYTE
(
dev_data
->
iocr_data
[
ii
]
->
type
);
pIOCR
->
TypeHighByte
=
_PN_U16_HIGH_BYTE
(
dev_data
->
iocr_data
[
ii
]
->
type
);
pIOCR
->
TypeLowByte
=
_PN_U16_LOW_BYTE
(
dev_data
->
iocr_data
[
ii
]
->
type
);
pIOCR
->
TypeLowByte
=
_PN_U16_LOW_BYTE
(
dev_data
->
iocr_data
[
ii
]
->
type
);
pIOCR
->
PropertiesHighWordHighByte
pIOCR
->
PropertiesHighWordHighByte
=
=
_PN_U32_HIGH_HIGH_BYTE
(
dev_data
->
iocr_data
[
ii
]
->
properties
);
_PN_U32_HIGH_HIGH_BYTE
(
dev_data
->
iocr_data
[
ii
]
->
properties
);
pIOCR
->
PropertiesHighWordLowByte
pIOCR
->
PropertiesHighWordLowByte
=
=
_PN_U32_HIGH_LOW_BYTE
(
dev_data
->
iocr_data
[
ii
]
->
properties
);
_PN_U32_HIGH_LOW_BYTE
(
dev_data
->
iocr_data
[
ii
]
->
properties
);
pIOCR
->
PropertiesLowWordHighByte
pIOCR
->
PropertiesLowWordHighByte
=
=
_PN_U32_LOW_HIGH_BYTE
(
dev_data
->
iocr_data
[
ii
]
->
properties
);
_PN_U32_LOW_HIGH_BYTE
(
dev_data
->
iocr_data
[
ii
]
->
properties
);
pIOCR
->
PropertiesLowWordLowByte
pIOCR
->
PropertiesLowWordLowByte
=
=
_PN_U32_LOW_LOW_BYTE
(
dev_data
->
iocr_data
[
ii
]
->
properties
);
_PN_U32_LOW_LOW_BYTE
(
dev_data
->
iocr_data
[
ii
]
->
properties
);
pIOCR
->
SendClockFactorHighByte
pIOCR
->
SendClockFactorHighByte
=
=
_PN_U16_HIGH_BYTE
(
dev_data
->
iocr_data
[
ii
]
->
send_clock_factor
);
_PN_U16_HIGH_BYTE
(
dev_data
->
iocr_data
[
ii
]
->
send_clock_factor
);
pIOCR
->
SendClockFactorLowByte
pIOCR
->
SendClockFactorLowByte
=
=
_PN_U16_LOW_BYTE
(
dev_data
->
iocr_data
[
ii
]
->
send_clock_factor
);
_PN_U16_LOW_BYTE
(
dev_data
->
iocr_data
[
ii
]
->
send_clock_factor
);
if
(
dev_data
->
iocr_data
[
ii
]
->
reduction_ratio
<
1
)
{
if
(
dev_data
->
iocr_data
[
ii
]
->
reduction_ratio
<
1
)
{
dev_data
->
iocr_data
[
ii
]
->
reduction_ratio
=
1
;
dev_data
->
iocr_data
[
ii
]
->
reduction_ratio
=
1
;
}
}
pIOCR
->
ReductionRatioHighByte
pIOCR
->
ReductionRatioHighByte
=
=
_PN_U16_HIGH_BYTE
(
dev_data
->
iocr_data
[
ii
]
->
reduction_ratio
);
_PN_U16_HIGH_BYTE
(
dev_data
->
iocr_data
[
ii
]
->
reduction_ratio
);
pIOCR
->
ReductionRatioLowByte
pIOCR
->
ReductionRatioLowByte
=
=
_PN_U16_LOW_BYTE
(
dev_data
->
iocr_data
[
ii
]
->
reduction_ratio
);
_PN_U16_LOW_BYTE
(
dev_data
->
iocr_data
[
ii
]
->
reduction_ratio
);
if
(
dev_data
->
iocr_data
[
ii
]
->
reduction_ratio
==
0
)
if
(
dev_data
->
iocr_data
[
ii
]
->
reduction_ratio
==
0
)
dev_data
->
iocr_data
[
ii
]
->
reduction_ratio
=
1
;
dev_data
->
iocr_data
[
ii
]
->
reduction_ratio
=
1
;
...
@@ -721,7 +750,8 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -721,7 +750,8 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
pAPIReference
=
(
T_PN_REFERENCE
*
)(
pIOCR
+
1
);
pAPIReference
=
(
T_PN_REFERENCE
*
)(
pIOCR
+
1
);
for
(
jj
=
0
;
jj
<
num_apis
;
jj
++
)
{
for
(
jj
=
0
;
jj
<
num_apis
;
jj
++
)
{
pAPIReference
->
ReferenceHighByte
=
_PN_U16_HIGH_BYTE
(
jj
);
pAPIReference
->
ReferenceHighByte
=
_PN_U16_HIGH_BYTE
(
jj
);
pAPIReference
->
ReferenceLowByte
=
_PN_U16_LOW_BYTE
(
jj
);
pAPIReference
->
ReferenceLowByte
=
_PN_U16_LOW_BYTE
(
jj
);
pAPIReference
++
;
pAPIReference
++
;
...
@@ -734,7 +764,8 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -734,7 +764,8 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
T_PN_API
*
pAPI
=
(
T_PN_API
*
)
pIOCR
;
T_PN_API
*
pAPI
=
(
T_PN_API
*
)
pIOCR
;
for
(
ii
=
0
;
ii
<
num_apis
;
ii
++
)
{
for
(
ii
=
0
;
ii
<
num_apis
;
ii
++
)
{
/* Fill data for API */
/* Fill data for API */
/* pAPI->APIHighWordHighByte = _PN_U32_HIGH_HIGH_BYTE(15616);
/* pAPI->APIHighWordHighByte = _PN_U32_HIGH_HIGH_BYTE(15616);
...
@@ -750,21 +781,22 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -750,21 +781,22 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
pAPI
->
APILowWordHighByte
=
_PN_U32_LOW_HIGH_BYTE
(
apis
[
ii
].
api
);
pAPI
->
APILowWordHighByte
=
_PN_U32_LOW_HIGH_BYTE
(
apis
[
ii
].
api
);
pAPI
->
APILowWordLowByte
=
_PN_U32_LOW_LOW_BYTE
(
apis
[
ii
].
api
);
pAPI
->
APILowWordLowByte
=
_PN_U32_LOW_LOW_BYTE
(
apis
[
ii
].
api
);
pAPI
->
NumberOfModulesHighByte
pAPI
->
NumberOfModulesHighByte
=
=
_PN_U16_HIGH_BYTE
(
apis
[
ii
].
module_index
.
size
());
_PN_U16_HIGH_BYTE
(
apis
[
ii
].
module_index
.
size
());
pAPI
->
NumberOfModulesLowByte
pAPI
->
NumberOfModulesLowByte
=
=
_PN_U16_LOW_BYTE
(
apis
[
ii
].
module_index
.
size
());
_PN_U16_LOW_BYTE
(
apis
[
ii
].
module_index
.
size
());
/* Fill references to Modules */
/* Fill references to Modules */
pModuleReference
=
(
T_PN_REFERENCE
*
)(
pAPI
+
1
);
pModuleReference
=
(
T_PN_REFERENCE
*
)(
pAPI
+
1
);
for
(
module_ind
=
0
;
module_ind
<
apis
[
ii
].
module_index
.
size
();
for
(
module_ind
=
0
;
module_ind
<
apis
[
ii
].
module_index
.
size
();
module_ind
++
)
{
module_ind
++
)
pModuleReference
->
ReferenceHighByte
{
=
_PN_U16_HIGH_BYTE
(
apis
[
ii
].
module_index
[
module_ind
]);
pModuleReference
->
ReferenceHighByte
=
pModuleReference
->
ReferenceLowByte
_PN_U16_HIGH_BYTE
(
apis
[
ii
].
module_index
[
module_ind
]);
=
_PN_U16_LOW_BYTE
(
apis
[
ii
].
module_index
[
module_ind
]);
pModuleReference
->
ReferenceLowByte
=
_PN_U16_LOW_BYTE
(
apis
[
ii
].
module_index
[
module_ind
]);
pModuleReference
++
;
pModuleReference
++
;
}
}
...
@@ -775,35 +807,37 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -775,35 +807,37 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
pModule
=
(
T_PN_MODULE
*
)
pAPI
;
pModule
=
(
T_PN_MODULE
*
)
pAPI
;
for
(
ii
=
0
;
ii
<
num_modules
;
ii
++
)
{
for
(
ii
=
0
;
ii
<
num_modules
;
ii
++
)
{
/* Fill data for MODULE */
/* Fill data for MODULE */
pModule
->
VersionHighByte
=
pSDR
->
VersionHighByte
;
pModule
->
VersionHighByte
=
pSDR
->
VersionHighByte
;
pModule
->
VersionLowByte
=
pSDR
->
VersionLowByte
;
pModule
->
VersionLowByte
=
pSDR
->
VersionLowByte
;
pModule
->
SlotNumberHighByte
pModule
->
SlotNumberHighByte
=
=
_PN_U16_HIGH_BYTE
(
dev_data
->
slot_data
[
ii
]
->
slot_number
);
_PN_U16_HIGH_BYTE
(
dev_data
->
slot_data
[
ii
]
->
slot_number
);
pModule
->
SlotNumberLowByte
pModule
->
SlotNumberLowByte
=
=
_PN_U16_LOW_BYTE
(
dev_data
->
slot_data
[
ii
]
->
slot_number
);
_PN_U16_LOW_BYTE
(
dev_data
->
slot_data
[
ii
]
->
slot_number
);
pModule
->
IdentNumberHighWordHighByte
pModule
->
IdentNumberHighWordHighByte
=
=
_PN_U32_HIGH_HIGH_BYTE
(
dev_data
->
slot_data
[
ii
]
->
module_ident_number
);
_PN_U32_HIGH_HIGH_BYTE
(
dev_data
->
slot_data
[
ii
]
->
module_ident_number
);
pModule
->
IdentNumberHighWordLowByte
pModule
->
IdentNumberHighWordLowByte
=
=
_PN_U32_HIGH_LOW_BYTE
(
dev_data
->
slot_data
[
ii
]
->
module_ident_number
);
_PN_U32_HIGH_LOW_BYTE
(
dev_data
->
slot_data
[
ii
]
->
module_ident_number
);
pModule
->
IdentNumberLowWordHighByte
pModule
->
IdentNumberLowWordHighByte
=
=
_PN_U32_LOW_HIGH_BYTE
(
dev_data
->
slot_data
[
ii
]
->
module_ident_number
);
_PN_U32_LOW_HIGH_BYTE
(
dev_data
->
slot_data
[
ii
]
->
module_ident_number
);
pModule
->
IdentNumberLowWordLowByte
pModule
->
IdentNumberLowWordLowByte
=
=
_PN_U32_LOW_LOW_BYTE
(
dev_data
->
slot_data
[
ii
]
->
module_ident_number
);
_PN_U32_LOW_LOW_BYTE
(
dev_data
->
slot_data
[
ii
]
->
module_ident_number
);
pModule
->
PropertiesHighByte
=
0
;
pModule
->
PropertiesHighByte
=
0
;
pModule
->
PropertiesLowByte
=
0
;
pModule
->
PropertiesLowByte
=
0
;
pModule
->
NumberOfSubmodulesHighByte
pModule
->
NumberOfSubmodulesHighByte
=
=
_PN_U16_HIGH_BYTE
(
dev_data
->
slot_data
[
ii
]
->
subslot_data
.
size
());
_PN_U16_HIGH_BYTE
(
dev_data
->
slot_data
[
ii
]
->
subslot_data
.
size
());
pModule
->
NumberOfSubmodulesLowByte
pModule
->
NumberOfSubmodulesLowByte
=
=
_PN_U16_LOW_BYTE
(
dev_data
->
slot_data
[
ii
]
->
subslot_data
.
size
());
_PN_U16_LOW_BYTE
(
dev_data
->
slot_data
[
ii
]
->
subslot_data
.
size
());
/* Fill the SUBMODULE's */
/* Fill the SUBMODULE's */
pSubModule
=
(
T_PN_SUBMODULE
*
)(
pModule
+
1
);
pSubModule
=
(
T_PN_SUBMODULE
*
)(
pModule
+
1
);
for
(
jj
=
0
;
jj
<
dev_data
->
slot_data
[
ii
]
->
subslot_data
.
size
();
jj
++
)
{
for
(
jj
=
0
;
jj
<
dev_data
->
slot_data
[
ii
]
->
subslot_data
.
size
();
jj
++
)
{
/* Fill data for the submodule */
/* Fill data for the submodule */
pSubModule
->
SubSlotNumberHighByte
=
_PN_U16_HIGH_BYTE
(
pSubModule
->
SubSlotNumberHighByte
=
_PN_U16_HIGH_BYTE
(
...
@@ -819,15 +853,21 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -819,15 +853,21 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
pSubModule
->
IdentNumberLowWordLowByte
=
_PN_U32_LOW_LOW_BYTE
(
pSubModule
->
IdentNumberLowWordLowByte
=
_PN_U32_LOW_LOW_BYTE
(
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
submodule_ident_number
);
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
submodule_ident_number
);
if
((
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
io_input_length
>
0
)
if
((
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
io_input_length
>
0
)
&&
&&
(
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
io_output_length
))
{
(
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
io_output_length
))
{
sub_prop
=
PROFINET_IO_SUBMODULE_TYPE_INPUT_AND_OUTPUT
;
sub_prop
=
PROFINET_IO_SUBMODULE_TYPE_INPUT_AND_OUTPUT
;
}
else
if
(
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
io_input_length
}
>
0
)
{
else
if
(
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
io_input_length
>
0
)
{
sub_prop
=
PROFINET_IO_SUBMODULE_TYPE_INPUT
;
sub_prop
=
PROFINET_IO_SUBMODULE_TYPE_INPUT
;
}
else
if
(
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
io_output_length
)
{
}
else
if
(
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
io_output_length
)
{
sub_prop
=
PROFINET_IO_SUBMODULE_TYPE_OUTPUT
;
sub_prop
=
PROFINET_IO_SUBMODULE_TYPE_OUTPUT
;
}
else
{
}
else
{
sub_prop
=
PROFINET_IO_SUBMODULE_TYPE_NO_INPUT_NO_OUTPUT
;
sub_prop
=
PROFINET_IO_SUBMODULE_TYPE_NO_INPUT_NO_OUTPUT
;
}
}
...
@@ -854,11 +894,12 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -854,11 +894,12 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
for
(
kk
=
0
;
for
(
kk
=
0
;
kk
<
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
data_record
.
size
();
kk
<
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
data_record
.
size
();
kk
++
)
{
kk
++
)
pDataRecordReference
->
ReferenceHighByte
{
=
_PN_U16_HIGH_BYTE
(
datarecord_ind
);
pDataRecordReference
->
ReferenceHighByte
=
pDataRecordReference
->
ReferenceLowByte
_PN_U16_HIGH_BYTE
(
datarecord_ind
);
=
_PN_U16_LOW_BYTE
(
datarecord_ind
);
pDataRecordReference
->
ReferenceLowByte
=
_PN_U16_LOW_BYTE
(
datarecord_ind
);
pDataRecordReference
++
;
pDataRecordReference
++
;
datarecord_ind
++
;
datarecord_ind
++
;
}
}
...
@@ -873,23 +914,26 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -873,23 +914,26 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
pDataRecord
=
(
T_PN_DATA_RECORD
*
)
pModule
;
pDataRecord
=
(
T_PN_DATA_RECORD
*
)
pModule
;
for
(
ii
=
0
;
ii
<
num_modules
;
ii
++
)
{
for
(
ii
=
0
;
ii
<
num_modules
;
ii
++
)
for
(
jj
=
0
;
jj
<
dev_data
->
slot_data
[
ii
]
->
subslot_data
.
size
();
jj
++
)
{
{
for
(
jj
=
0
;
jj
<
dev_data
->
slot_data
[
ii
]
->
subslot_data
.
size
();
jj
++
)
{
for
(
kk
=
0
;
for
(
kk
=
0
;
kk
<
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
data_record
.
size
();
kk
<
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
data_record
.
size
();
kk
++
)
{
kk
++
)
{
pDataRecord
->
VersionHighByte
=
pSDR
->
VersionHighByte
;
pDataRecord
->
VersionHighByte
=
pSDR
->
VersionHighByte
;
pDataRecord
->
VersionLowByte
=
pSDR
->
VersionLowByte
;
pDataRecord
->
VersionLowByte
=
pSDR
->
VersionLowByte
;
pDataRecord
->
SequenceHighByte
pDataRecord
->
SequenceHighByte
=
=
_PN_U16_HIGH_BYTE
(
dev_data
->
slot_data
[
ii
]
_PN_U16_HIGH_BYTE
(
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
subslot_data
[
jj
]
->
data_record
[
kk
]
->
data_record
[
kk
]
->
transfer_sequence
);
->
transfer_sequence
);
pDataRecord
->
SequenceLowByte
pDataRecord
->
SequenceLowByte
=
=
_PN_U16_LOW_BYTE
(
dev_data
->
slot_data
[
ii
]
_PN_U16_LOW_BYTE
(
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
subslot_data
[
jj
]
->
data_record
[
kk
]
->
data_record
[
kk
]
->
transfer_sequence
);
->
transfer_sequence
);
pDataRecord
->
APIHighWordHighByte
=
_PN_U32_HIGH_HIGH_BYTE
(
pDataRecord
->
APIHighWordHighByte
=
_PN_U32_HIGH_HIGH_BYTE
(
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
api
);
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
api
);
pDataRecord
->
APIHighWordLowByte
=
_PN_U32_HIGH_LOW_BYTE
(
pDataRecord
->
APIHighWordLowByte
=
_PN_U32_HIGH_LOW_BYTE
(
...
@@ -921,11 +965,11 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -921,11 +965,11 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
pData
=
(
char
*
)(
pDataRecord
+
1
);
pData
=
(
char
*
)(
pDataRecord
+
1
);
memcpy
(
pData
,
memcpy
(
pData
,
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
data_record
[
kk
]
->
data
,
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
data_record
[
kk
]
->
data
,
dev_data
->
slot_data
[
ii
]
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
subslot_data
[
jj
]
->
data_record
[
kk
]
->
data_record
[
kk
]
->
data_length
);
->
data_length
);
pData
+=
dev_data
->
slot_data
[
ii
]
pData
+=
dev_data
->
slot_data
[
ii
]
->
subslot_data
[
jj
]
->
subslot_data
[
jj
]
->
data_record
[
kk
]
->
data_record
[
kk
]
...
@@ -954,7 +998,8 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
...
@@ -954,7 +998,8 @@ void pack_download_req(T_PNAK_SERVICE_REQ_RES* ServiceReqRes,
int
unpack_get_los_con
(
T_PNAK_SERVICE_DESCRIPTION
*
pSdb
,
io_sAgentLocal
*
local
)
int
unpack_get_los_con
(
T_PNAK_SERVICE_DESCRIPTION
*
pSdb
,
io_sAgentLocal
*
local
)
{
{
if
(
pSdb
->
Result
==
PNAK_RESULT_POS
)
{
if
(
pSdb
->
Result
==
PNAK_RESULT_POS
)
{
T_PN_SERVICE_GET_LIST_OF_STATION_CON
*
pGetLOSCon
;
T_PN_SERVICE_GET_LIST_OF_STATION_CON
*
pGetLOSCon
;
T_PN_DEVICE_INFO
*
pDeviceInfo
;
T_PN_DEVICE_INFO
*
pDeviceInfo
;
PnDeviceInfo
*
dev_info
;
PnDeviceInfo
*
dev_info
;
...
@@ -965,16 +1010,17 @@ int unpack_get_los_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
...
@@ -965,16 +1010,17 @@ int unpack_get_los_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
pGetLOSCon
=
(
T_PN_SERVICE_GET_LIST_OF_STATION_CON
*
)(
pSdb
+
1
);
pGetLOSCon
=
(
T_PN_SERVICE_GET_LIST_OF_STATION_CON
*
)(
pSdb
+
1
);
pDeviceInfo
=
(
T_PN_DEVICE_INFO
*
)(
pGetLOSCon
+
1
);
pDeviceInfo
=
(
T_PN_DEVICE_INFO
*
)(
pGetLOSCon
+
1
);
NumberDevices
NumberDevices
=
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pGetLOSCon
->
NumberOfDevicesHighByte
,
_HIGH_LOW_BYTES_TO_PN_U16
(
pGetLOSCon
->
NumberOfDevicesHighByte
,
pGetLOSCon
->
NumberOfDevicesLowByte
);
pGetLOSCon
->
NumberOfDevicesLowByte
);
/* Find configured device */
/* Find configured device */
if
(
NumberDevices
==
0
)
if
(
NumberDevices
==
0
)
printf
(
"0
\r\n
"
);
printf
(
"0
\r\n
"
);
for
(
ii
=
0
;
ii
<
NumberDevices
;
ii
++
)
{
for
(
ii
=
0
;
ii
<
NumberDevices
;
ii
++
)
{
dev_info
=
new
PnDeviceInfo
;
dev_info
=
new
PnDeviceInfo
;
dev_info
->
ipaddress
[
3
]
=
pDeviceInfo
->
Ip
.
AddressHighWordHighByte
;
dev_info
->
ipaddress
[
3
]
=
pDeviceInfo
->
Ip
.
AddressHighWordHighByte
;
...
@@ -989,24 +1035,24 @@ int unpack_get_los_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
...
@@ -989,24 +1035,24 @@ int unpack_get_los_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
dev_info
->
macaddress
[
1
]
=
pDeviceInfo
->
MacAddress
.
LowHighByte
;
dev_info
->
macaddress
[
1
]
=
pDeviceInfo
->
MacAddress
.
LowHighByte
;
dev_info
->
macaddress
[
0
]
=
pDeviceInfo
->
MacAddress
.
LowLowByte
;
dev_info
->
macaddress
[
0
]
=
pDeviceInfo
->
MacAddress
.
LowLowByte
;
dev_info
->
deviceid
dev_info
->
deviceid
=
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pDeviceInfo
->
Property
.
DeviceIdHighByte
,
_HIGH_LOW_BYTES_TO_PN_U16
(
pDeviceInfo
->
Property
.
DeviceIdHighByte
,
pDeviceInfo
->
Property
.
DeviceIdLowByte
);
pDeviceInfo
->
Property
.
DeviceIdLowByte
);
dev_info
->
vendorid
dev_info
->
vendorid
=
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pDeviceInfo
->
Property
.
VendorIdHighByte
,
_HIGH_LOW_BYTES_TO_PN_U16
(
pDeviceInfo
->
Property
.
VendorIdHighByte
,
pDeviceInfo
->
Property
.
VendorIdLowByte
);
pDeviceInfo
->
Property
.
VendorIdLowByte
);
name_length
name_length
=
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pDeviceInfo
->
DeviceNameLengthHighByte
,
_HIGH_LOW_BYTES_TO_PN_U16
(
pDeviceInfo
->
DeviceNameLengthHighByte
,
pDeviceInfo
->
DeviceNameLengthLowByte
);
pDeviceInfo
->
DeviceNameLengthLowByte
);
printf
(
"no: %d mac: %hhx:%hhx:%hhx:%hhx:%hhx:%hhx
\r\n
"
,
printf
(
"no: %d mac: %hhx:%hhx:%hhx:%hhx:%hhx:%hhx
\r\n
"
,
NumberDevices
,
pDeviceInfo
->
MacAddress
.
HighAndVersionHighByte
,
NumberDevices
,
pDeviceInfo
->
MacAddress
.
HighAndVersionHighByte
,
pDeviceInfo
->
MacAddress
.
HighAndVersionLowByte
,
pDeviceInfo
->
MacAddress
.
HighAndVersionLowByte
,
pDeviceInfo
->
MacAddress
.
MidHighByte
,
pDeviceInfo
->
MacAddress
.
MidHighByte
,
pDeviceInfo
->
MacAddress
.
MidLowByte
,
pDeviceInfo
->
MacAddress
.
MidLowByte
,
pDeviceInfo
->
MacAddress
.
LowHighByte
,
pDeviceInfo
->
MacAddress
.
LowHighByte
,
pDeviceInfo
->
MacAddress
.
LowLowByte
);
pDeviceInfo
->
MacAddress
.
LowLowByte
);
pDeviceInfo
++
;
pDeviceInfo
++
;
...
@@ -1015,11 +1061,13 @@ int unpack_get_los_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
...
@@ -1015,11 +1061,13 @@ int unpack_get_los_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
local
->
dev_info
.
push_back
(
dev_info
);
local
->
dev_info
.
push_back
(
dev_info
);
pDeviceInfo
pDeviceInfo
=
=
(
T_PN_DEVICE_INFO
*
)((
unsigned
char
*
)
pDeviceInfo
+
name_length
);
(
T_PN_DEVICE_INFO
*
)((
unsigned
char
*
)
pDeviceInfo
+
name_length
);
}
}
return
PNAK_OK
;
return
PNAK_OK
;
}
else
if
(
pSdb
->
Result
==
PNAK_RESULT_NEG
)
{
}
else
if
(
pSdb
->
Result
==
PNAK_RESULT_NEG
)
{
T_PN_SERVICE_ERROR_CON
*
pErrorCon
=
(
T_PN_SERVICE_ERROR_CON
*
)(
pSdb
+
1
);
T_PN_SERVICE_ERROR_CON
*
pErrorCon
=
(
T_PN_SERVICE_ERROR_CON
*
)(
pSdb
+
1
);
printf
(
"channel %d: get_los.con [-] (%d)
\r\n
"
printf
(
"channel %d: get_los.con [-] (%d)
\r\n
"
...
@@ -1027,9 +1075,10 @@ int unpack_get_los_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
...
@@ -1027,9 +1075,10 @@ int unpack_get_los_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
" detail : %d (0x%02x)
\r\n
"
" detail : %d (0x%02x)
\r\n
"
" add. detail: %d (0x%02x)
\r\n
"
" add. detail: %d (0x%02x)
\r\n
"
" area : %d (0x%02x)
\r\n
"
,
" area : %d (0x%02x)
\r\n
"
,
0
,
pSdb
->
DeviceRef
,
pErrorCon
->
Code
,
pErrorCon
->
Code
,
pErrorCon
->
Detail
,
0
,
pSdb
->
DeviceRef
,
pErrorCon
->
Code
,
pErrorCon
->
Code
,
pErrorCon
->
Detail
,
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
Detail
,
pErrorCon
->
Detail
,
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
AreaCode
,
pErrorCon
->
AreaCode
);
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
AreaCode
,
pErrorCon
->
AreaCode
);
}
}
return
-
1
;
return
-
1
;
...
@@ -1037,10 +1086,13 @@ int unpack_get_los_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
...
@@ -1037,10 +1086,13 @@ int unpack_get_los_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
int
unpack_write_con
(
T_PNAK_SERVICE_DESCRIPTION
*
pSdb
,
io_sAgentLocal
*
local
)
int
unpack_write_con
(
T_PNAK_SERVICE_DESCRIPTION
*
pSdb
,
io_sAgentLocal
*
local
)
{
{
if
(
pSdb
->
Result
==
PNAK_RESULT_POS
)
{
if
(
pSdb
->
Result
==
PNAK_RESULT_POS
)
{
// printf("Write con...\n");
// printf("Write con...\n");
return
PNAK_OK
;
return
PNAK_OK
;
}
else
if
(
pSdb
->
Result
==
PNAK_RESULT_NEG
)
{
}
else
if
(
pSdb
->
Result
==
PNAK_RESULT_NEG
)
{
T_PN_SERVICE_ERROR_CON
*
pErrorCon
=
(
T_PN_SERVICE_ERROR_CON
*
)(
pSdb
+
1
);
T_PN_SERVICE_ERROR_CON
*
pErrorCon
=
(
T_PN_SERVICE_ERROR_CON
*
)(
pSdb
+
1
);
printf
(
"channel %d: write.con [-] (%d)
\r\n
"
printf
(
"channel %d: write.con [-] (%d)
\r\n
"
...
@@ -1048,18 +1100,20 @@ int unpack_write_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
...
@@ -1048,18 +1100,20 @@ int unpack_write_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
" detail : %d (0x%02x)
\r\n
"
" detail : %d (0x%02x)
\r\n
"
" add. detail: %d (0x%02x)
\r\n
"
" add. detail: %d (0x%02x)
\r\n
"
" area : %d (0x%02x)
\r\n
"
,
" area : %d (0x%02x)
\r\n
"
,
0
,
pSdb
->
DeviceRef
,
pErrorCon
->
Code
,
pErrorCon
->
Code
,
pErrorCon
->
Detail
,
0
,
pSdb
->
DeviceRef
,
pErrorCon
->
Code
,
pErrorCon
->
Code
,
pErrorCon
->
Detail
,
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
Detail
,
pErrorCon
->
Detail
,
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
AreaCode
,
pErrorCon
->
AreaCode
);
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
AreaCode
,
pErrorCon
->
AreaCode
);
}
}
return
-
1
;
return
-
1
;
}
}
int
unpack_get_alarm_con
(
int
unpack_get_alarm_con
(
T_PNAK_SERVICE_DESCRIPTION
*
pSdb
,
T_PNAK_SERVICE_DESCRIPTION
*
pSdb
,
io_sAgentLocal
*
local
,
io_sAgent
*
ap
)
io_sAgentLocal
*
local
,
io_sAgent
*
ap
)
{
{
if
(
pSdb
->
Result
==
PNAK_RESULT_POS
)
{
if
(
pSdb
->
Result
==
PNAK_RESULT_POS
)
{
T_PN_SERVICE_GET_ALARM_CON
*
pGAC
;
T_PN_SERVICE_GET_ALARM_CON
*
pGAC
;
unsigned
short
alarm_type
;
unsigned
short
alarm_type
;
...
@@ -1081,34 +1135,36 @@ int unpack_get_alarm_con(
...
@@ -1081,34 +1135,36 @@ int unpack_get_alarm_con(
alarm_prio
=
pGAC
->
AlarmPriority
;
alarm_prio
=
pGAC
->
AlarmPriority
;
rem_alarms
=
pGAC
->
RemainingAlarms
;
rem_alarms
=
pGAC
->
RemainingAlarms
;
alarm_ref
=
_HIGH_LOW_BYTES_TO_PN_U16
(
alarm_ref
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pGAC
->
AlarmRefHighByte
,
pGAC
->
AlarmRefHighByte
,
pGAC
->
AlarmRefLowByte
);
pGAC
->
AlarmRefLowByte
);
alarm_type
=
_HIGH_LOW_BYTES_TO_PN_U16
(
alarm_type
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pGAC
->
AlarmTypeHighByte
,
pGAC
->
AlarmTypeHighByte
,
pGAC
->
AlarmTypeLowByte
);
pGAC
->
AlarmTypeLowByte
);
slot_number
=
_HIGH_LOW_BYTES_TO_PN_U16
(
slot_number
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pGAC
->
SlotNumberHighByte
,
pGAC
->
SlotNumberHighByte
,
pGAC
->
SlotNumberLowByte
);
pGAC
->
SlotNumberLowByte
);
sub_slot_number
=
_HIGH_LOW_BYTES_TO_PN_U16
(
sub_slot_number
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pGAC
->
SubSlotNumberHighByte
,
pGAC
->
SubSlotNumberHighByte
,
pGAC
->
SubSlotNumberLowByte
);
pGAC
->
SubSlotNumberLowByte
);
module_ident_number
module_ident_number
=
=
_HIGH_LOW_BYTES_TO_PN_U32
(
pGAC
->
ModuleIdentNumberHighWordHighByte
,
_HIGH_LOW_BYTES_TO_PN_U32
(
pGAC
->
ModuleIdentNumberHighWordHighByte
,
pGAC
->
ModuleIdentNumberHighWordLowByte
,
pGAC
->
ModuleIdentNumberHighWordLowByte
,
pGAC
->
ModuleIdentNumberLowWordHighByte
,
pGAC
->
ModuleIdentNumberLowWordHighByte
,
pGAC
->
ModuleIdentNumberLowWordLowByte
);
pGAC
->
ModuleIdentNumberLowWordLowByte
);
submodule_ident_number
submodule_ident_number
=
=
_HIGH_LOW_BYTES_TO_PN_U32
(
pGAC
->
SubmoduleIdentNumberHighWordHighByte
,
_HIGH_LOW_BYTES_TO_PN_U32
(
pGAC
->
SubmoduleIdentNumberHighWordHighByte
,
pGAC
->
SubmoduleIdentNumberHighWordLowByte
,
pGAC
->
SubmoduleIdentNumberHighWordLowByte
,
pGAC
->
SubmoduleIdentNumberLowWordHighByte
,
pGAC
->
SubmoduleIdentNumberLowWordHighByte
,
pGAC
->
SubmoduleIdentNumberLowWordLowByte
);
pGAC
->
SubmoduleIdentNumberLowWordLowByte
);
alarm_spec
=
_HIGH_LOW_BYTES_TO_PN_U16
(
alarm_spec
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pGAC
->
SpecifierHighByte
,
pGAC
->
SpecifierHighByte
,
pGAC
->
SpecifierLowByte
);
pGAC
->
SpecifierLowByte
);
data_length
data_length
=
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pGAC
->
LengthHighByte
,
pGAC
->
LengthLowByte
);
_HIGH_LOW_BYTES_TO_PN_U16
(
pGAC
->
LengthHighByte
,
pGAC
->
LengthLowByte
);
data
=
(
unsigned
char
*
)(
pGAC
+
1
);
data
=
(
unsigned
char
*
)(
pGAC
+
1
);
/* Find the device */
/* Find the device */
for
(
ii
=
0
;
ii
<
local
->
device_data
.
size
();
ii
++
)
{
for
(
ii
=
0
;
ii
<
local
->
device_data
.
size
();
ii
++
)
if
(
local
->
device_data
[
ii
]
->
alarm_ref
==
alarm_ref
)
{
{
if
(
local
->
device_data
[
ii
]
->
alarm_ref
==
alarm_ref
)
{
device
=
local
->
device_data
[
ii
];
device
=
local
->
device_data
[
ii
];
device
->
alarm_data
.
alarm_type
=
alarm_type
;
device
->
alarm_data
.
alarm_type
=
alarm_type
;
...
@@ -1125,14 +1181,17 @@ int unpack_get_alarm_con(
...
@@ -1125,14 +1181,17 @@ int unpack_get_alarm_con(
}
}
}
}
if
(
ap
)
{
if
(
ap
)
{
/* Find corresponding device */
/* Find corresponding device */
io_sRack
*
slave_list
;
io_sRack
*
slave_list
;
for
(
slave_list
=
ap
->
racklist
,
jj
=
0
;
for
(
slave_list
=
ap
->
racklist
,
jj
=
0
;
(
slave_list
!=
NULL
)
&&
jj
<
ii
-
1
;
(
slave_list
!=
NULL
)
&&
jj
<
ii
-
1
;
slave_list
=
slave_list
->
next
,
jj
++
)
{
slave_list
=
slave_list
->
next
,
jj
++
)
{
}
}
if
(
slave_list
)
{
if
(
slave_list
)
{
pwr_sClass_PnDevice
*
dev
;
pwr_sClass_PnDevice
*
dev
;
dev
=
(
pwr_sClass_PnDevice
*
)
slave_list
->
op
;
dev
=
(
pwr_sClass_PnDevice
*
)
slave_list
->
op
;
...
@@ -1145,9 +1204,10 @@ int unpack_get_alarm_con(
...
@@ -1145,9 +1204,10 @@ int unpack_get_alarm_con(
dev
->
Alarm
.
SubmoduleIdentNumber
=
submodule_ident_number
;
dev
->
Alarm
.
SubmoduleIdentNumber
=
submodule_ident_number
;
dev
->
Alarm
.
Specifier
=
alarm_spec
;
dev
->
Alarm
.
Specifier
=
alarm_spec
;
dev
->
Alarm
.
ManuSpecLength
=
data_length
;
dev
->
Alarm
.
ManuSpecLength
=
data_length
;
if
(
data_length
>
0
)
{
if
(
data_length
>
0
)
memcpy
(
{
dev
->
Alarm
.
Data
,
data
,
MIN
(
data_length
,
sizeof
(
dev
->
Alarm
.
Data
)));
memcpy
(
dev
->
Alarm
.
Data
,
data
,
MIN
(
data_length
,
sizeof
(
dev
->
Alarm
.
Data
)));
}
}
}
}
}
}
...
@@ -1160,10 +1220,12 @@ int unpack_get_alarm_con(
...
@@ -1160,10 +1220,12 @@ int unpack_get_alarm_con(
" module_id %d
\r\n
"
" module_id %d
\r\n
"
" submodule_id %d
\r\n
"
" submodule_id %d
\r\n
"
" spec %d
\r\n
"
,
" spec %d
\r\n
"
,
alarm_prio
,
rem_alarms
,
alarm_type
,
slot_number
,
sub_slot_number
,
alarm_prio
,
rem_alarms
,
alarm_type
,
slot_number
,
sub_slot_number
,
module_ident_number
,
submodule_ident_number
,
alarm_spec
);
module_ident_number
,
submodule_ident_number
,
alarm_spec
);
return
PNAK_OK
;
return
PNAK_OK
;
}
else
if
(
pSdb
->
Result
==
PNAK_RESULT_NEG
)
{
}
else
if
(
pSdb
->
Result
==
PNAK_RESULT_NEG
)
{
T_PN_SERVICE_ERROR_CON
*
pErrorCon
=
(
T_PN_SERVICE_ERROR_CON
*
)(
pSdb
+
1
);
T_PN_SERVICE_ERROR_CON
*
pErrorCon
=
(
T_PN_SERVICE_ERROR_CON
*
)(
pSdb
+
1
);
printf
(
"channel %d: get_los.con [-] (%d)
\r\n
"
printf
(
"channel %d: get_los.con [-] (%d)
\r\n
"
...
@@ -1171,17 +1233,19 @@ int unpack_get_alarm_con(
...
@@ -1171,17 +1233,19 @@ int unpack_get_alarm_con(
" detail : %d (0x%02x)
\r\n
"
" detail : %d (0x%02x)
\r\n
"
" add. detail: %d (0x%02x)
\r\n
"
" add. detail: %d (0x%02x)
\r\n
"
" area : %d (0x%02x)
\r\n
"
,
" area : %d (0x%02x)
\r\n
"
,
0
,
pSdb
->
DeviceRef
,
pErrorCon
->
Code
,
pErrorCon
->
Code
,
pErrorCon
->
Detail
,
0
,
pSdb
->
DeviceRef
,
pErrorCon
->
Code
,
pErrorCon
->
Code
,
pErrorCon
->
Detail
,
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
Detail
,
pErrorCon
->
Detail
,
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
AreaCode
,
pErrorCon
->
AreaCode
);
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
AreaCode
,
pErrorCon
->
AreaCode
);
}
}
return
-
1
;
return
-
1
;
}
}
int
unpack_get_device_state_con
(
int
unpack_get_device_state_con
(
T_PNAK_SERVICE_DESCRIPTION
*
pSdb
,
T_PNAK_SERVICE_DESCRIPTION
*
pSdb
,
io_sAgentLocal
*
local
,
io_sAgent
*
ap
)
io_sAgentLocal
*
local
,
io_sAgent
*
ap
)
{
{
if
(
pSdb
->
Result
==
PNAK_RESULT_POS
)
{
if
(
pSdb
->
Result
==
PNAK_RESULT_POS
)
{
T_PN_SERVICE_GET_DEVICE_STATE_CON
*
pGDSC
;
T_PN_SERVICE_GET_DEVICE_STATE_CON
*
pGDSC
;
T_PN_DIFF_MODULE
*
pDiffModule
;
T_PN_DIFF_MODULE
*
pDiffModule
;
...
@@ -1200,8 +1264,10 @@ int unpack_get_device_state_con(
...
@@ -1200,8 +1264,10 @@ int unpack_get_device_state_con(
/* Find configured device */
/* Find configured device */
for
(
ii
=
0
;
ii
<
local
->
device_data
.
size
();
ii
++
)
{
for
(
ii
=
0
;
ii
<
local
->
device_data
.
size
();
ii
++
)
if
(
local
->
device_data
[
ii
]
->
device_ref
==
device_ref
)
{
{
if
(
local
->
device_data
[
ii
]
->
device_ref
==
device_ref
)
{
device
=
local
->
device_data
[
ii
];
device
=
local
->
device_data
[
ii
];
break
;
break
;
}
}
...
@@ -1218,50 +1284,55 @@ int unpack_get_device_state_con(
...
@@ -1218,50 +1284,55 @@ int unpack_get_device_state_con(
pGDSC
->
NumberOfDiffModulesHighByte
,
pGDSC
->
NumberOfDiffModulesLowByte
);
pGDSC
->
NumberOfDiffModulesHighByte
,
pGDSC
->
NumberOfDiffModulesLowByte
);
device
->
no_diff_modules
=
no_diff_modules
;
device
->
no_diff_modules
=
no_diff_modules
;
device
->
device_state
device
->
device_state
=
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pGDSC
->
StateHighByte
,
pGDSC
->
StateLowByte
);
_HIGH_LOW_BYTES_TO_PN_U16
(
pGDSC
->
StateHighByte
,
pGDSC
->
StateLowByte
);
// printf("No diff modules: %d \r\n", no_diff_modules);
// printf("No diff modules: %d \r\n", no_diff_modules);
for
(
diff_mod_index
=
0u
;
diff_mod_index
<
no_diff_modules
;
for
(
diff_mod_index
=
0u
;
diff_mod_index
<
no_diff_modules
;
diff_mod_index
++
)
{
diff_mod_index
++
)
T_PN_DIFF_MODULE_API
*
pDiffModuleAPI
{
=
(
T_PN_DIFF_MODULE_API
*
)(
pDiffModule
+
1
);
T_PN_DIFF_MODULE_API
*
pDiffModuleAPI
=
(
T_PN_DIFF_MODULE_API
*
)(
pDiffModule
+
1
);
PN_U16
no_apis
;
PN_U16
no_apis
;
PN_U16
api_ind
;
PN_U16
api_ind
;
no_apis
=
_HIGH_LOW_BYTES_TO_PN_U16
(
no_apis
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pDiffModule
->
NumberOfAPIsHighByte
,
pDiffModule
->
NumberOfAPIsHighByte
,
pDiffModule
->
NumberOfAPIsLowByte
);
pDiffModule
->
NumberOfAPIsLowByte
);
for
(
api_ind
=
0u
;
api_ind
<
no_apis
;
api_ind
++
)
{
for
(
api_ind
=
0u
;
api_ind
<
no_apis
;
api_ind
++
)
T_PN_DIFF_MODULE_SLOT
*
pModuleSlot
{
=
(
T_PN_DIFF_MODULE_SLOT
*
)(
pDiffModuleAPI
+
1
);
T_PN_DIFF_MODULE_SLOT
*
pModuleSlot
=
(
T_PN_DIFF_MODULE_SLOT
*
)(
pDiffModuleAPI
+
1
);
PN_U16
no_slots
;
PN_U16
no_slots
;
PN_U16
slot_ind
;
PN_U16
slot_ind
;
no_slots
no_slots
=
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pDiffModuleAPI
->
NumberOfModulesHighByte
,
_HIGH_LOW_BYTES_TO_PN_U16
(
pDiffModuleAPI
->
NumberOfModulesHighByte
,
pDiffModuleAPI
->
NumberOfModulesLowByte
);
pDiffModuleAPI
->
NumberOfModulesLowByte
);
for
(
slot_ind
=
0u
;
slot_ind
<
no_slots
;
slot_ind
++
)
{
for
(
slot_ind
=
0u
;
slot_ind
<
no_slots
;
slot_ind
++
)
T_PN_DIFF_MODULE_SUBSLOT
*
pModuleSubSlot
{
=
(
T_PN_DIFF_MODULE_SUBSLOT
*
)(
pModuleSlot
+
1
);
T_PN_DIFF_MODULE_SUBSLOT
*
pModuleSubSlot
=
(
T_PN_DIFF_MODULE_SUBSLOT
*
)(
pModuleSlot
+
1
);
PN_U16
no_subslots
;
PN_U16
no_subslots
;
PN_U16
subslot_ind
;
PN_U16
subslot_ind
;
PnModuleData
*
module_data
=
NULL
;
PnModuleData
*
module_data
=
NULL
;
no_subslots
=
_HIGH_LOW_BYTES_TO_PN_U16
(
no_subslots
=
pModuleSlot
->
NumberOfSubmodulesHighByte
,
_HIGH_LOW_BYTES_TO_PN_U16
(
pModuleSlot
->
NumberOfSubmodulesHighByte
,
pModuleSlot
->
NumberOfSubmodulesLowByte
);
pModuleSlot
->
NumberOfSubmodulesLowByte
);
for
(
ii
=
0
;
ii
<
device
->
module_data
.
size
();
ii
++
)
{
for
(
ii
=
0
;
ii
<
device
->
module_data
.
size
();
ii
++
)
{
module_data
=
device
->
module_data
[
ii
];
module_data
=
device
->
module_data
[
ii
];
if
(
module_data
->
slot_number
if
(
module_data
->
slot_number
==
==
_HIGH_LOW_BYTES_TO_PN_U16
(
pModuleSlot
->
SlotNumberHighByte
,
_HIGH_LOW_BYTES_TO_PN_U16
(
pModuleSlot
->
SlotNumberHighByte
,
pModuleSlot
->
SlotNumberLowByte
))
{
pModuleSlot
->
SlotNumberLowByte
))
{
module_data
->
state
=
_HIGH_LOW_BYTES_TO_PN_U16
(
module_data
->
state
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pModuleSlot
->
StateHighByte
,
pModuleSlot
->
StateLowByte
);
pModuleSlot
->
StateHighByte
,
pModuleSlot
->
StateLowByte
);
module_data
->
phys_ident_number
=
_HIGH_LOW_BYTES_TO_PN_U32
(
module_data
->
phys_ident_number
=
_HIGH_LOW_BYTES_TO_PN_U32
(
...
@@ -1271,7 +1342,8 @@ int unpack_get_device_state_con(
...
@@ -1271,7 +1342,8 @@ int unpack_get_device_state_con(
pModuleSlot
->
IdentNumberLowWordLowByte
);
pModuleSlot
->
IdentNumberLowWordLowByte
);
// printf(" Slot no: %d, State: %d \r\n",
// printf(" Slot no: %d, State: %d \r\n",
// module_data->slot_number, module_data->state);
// module_data->slot_number, module_data->state);
if
(
save_first
)
{
if
(
save_first
)
{
err_slot_number
=
module_data
->
slot_number
;
err_slot_number
=
module_data
->
slot_number
;
err_module_state
=
module_data
->
state
;
err_module_state
=
module_data
->
state
;
phys_ident_number
=
module_data
->
phys_ident_number
;
phys_ident_number
=
module_data
->
phys_ident_number
;
...
@@ -1281,19 +1353,23 @@ int unpack_get_device_state_con(
...
@@ -1281,19 +1353,23 @@ int unpack_get_device_state_con(
}
}
}
}
for
(
subslot_ind
=
0
;
subslot_ind
<
no_subslots
;
subslot_ind
++
)
{
for
(
subslot_ind
=
0
;
subslot_ind
<
no_subslots
;
subslot_ind
++
)
{
PnSubmoduleData
*
submodule_data
;
PnSubmoduleData
*
submodule_data
;
if
(
ii
<
device
->
module_data
.
size
())
{
if
(
ii
<
device
->
module_data
.
size
())
for
(
jj
=
0
;
jj
<
module_data
->
submodule_data
.
size
();
jj
++
)
{
{
for
(
jj
=
0
;
jj
<
module_data
->
submodule_data
.
size
();
jj
++
)
{
submodule_data
=
module_data
->
submodule_data
[
jj
];
submodule_data
=
module_data
->
submodule_data
[
jj
];
if
(
submodule_data
->
subslot_number
if
(
submodule_data
->
subslot_number
==
==
_HIGH_LOW_BYTES_TO_PN_U16
(
_HIGH_LOW_BYTES_TO_PN_U16
(
pModuleSubSlot
->
SubSlotNumberHighByte
,
pModuleSubSlot
->
SubSlotNumberHighByte
,
pModuleSubSlot
->
SubSlotNumberLowByte
))
{
pModuleSubSlot
->
SubSlotNumberLowByte
))
submodule_data
->
state
{
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pModuleSubSlot
->
StateHighByte
,
submodule_data
->
state
=
pModuleSubSlot
->
StateLowByte
);
_HIGH_LOW_BYTES_TO_PN_U16
(
pModuleSubSlot
->
StateHighByte
,
pModuleSubSlot
->
StateLowByte
);
submodule_data
->
phys_ident_number
=
_HIGH_LOW_BYTES_TO_PN_U32
(
submodule_data
->
phys_ident_number
=
_HIGH_LOW_BYTES_TO_PN_U32
(
pModuleSubSlot
->
IdentNumberHighWordHighByte
,
pModuleSubSlot
->
IdentNumberHighWordHighByte
,
pModuleSubSlot
->
IdentNumberHighWordLowByte
,
pModuleSubSlot
->
IdentNumberHighWordLowByte
,
...
@@ -1314,14 +1390,17 @@ int unpack_get_device_state_con(
...
@@ -1314,14 +1390,17 @@ int unpack_get_device_state_con(
pDiffModule
=
(
T_PN_DIFF_MODULE
*
)
pDiffModuleAPI
;
pDiffModule
=
(
T_PN_DIFF_MODULE
*
)
pDiffModuleAPI
;
}
}
if
(
ap
)
{
if
(
ap
)
{
/* Find corresponding device */
/* Find corresponding device */
io_sRack
*
slave_list
;
io_sRack
*
slave_list
;
for
(
slave_list
=
ap
->
racklist
,
jj
=
0
;
for
(
slave_list
=
ap
->
racklist
,
jj
=
0
;
(
slave_list
!=
NULL
)
&&
jj
<
dev_ind
-
1
;
(
slave_list
!=
NULL
)
&&
jj
<
dev_ind
-
1
;
slave_list
=
slave_list
->
next
,
jj
++
)
{
slave_list
=
slave_list
->
next
,
jj
++
)
{
}
}
if
(
slave_list
)
{
if
(
slave_list
)
{
pwr_sClass_PnDevice
*
dev
;
pwr_sClass_PnDevice
*
dev
;
dev
=
(
pwr_sClass_PnDevice
*
)
slave_list
->
op
;
dev
=
(
pwr_sClass_PnDevice
*
)
slave_list
->
op
;
dev
->
NoDiffModules
=
no_diff_modules
;
dev
->
NoDiffModules
=
no_diff_modules
;
...
@@ -1329,11 +1408,14 @@ int unpack_get_device_state_con(
...
@@ -1329,11 +1408,14 @@ int unpack_get_device_state_con(
dev
->
Status
=
PB__NORMAL
;
dev
->
Status
=
PB__NORMAL
;
else
else
dev
->
Status
=
PB__NOCONN
;
dev
->
Status
=
PB__NOCONN
;
if
(
!
save_first
)
{
if
(
!
save_first
)
{
dev
->
ErrSlotNumber
=
err_slot_number
;
dev
->
ErrSlotNumber
=
err_slot_number
;
dev
->
ErrModuleState
=
err_module_state
;
dev
->
ErrModuleState
=
err_module_state
;
dev
->
PhysIdentNumber
=
phys_ident_number
;
dev
->
PhysIdentNumber
=
phys_ident_number
;
}
else
{
}
else
{
dev
->
ErrSlotNumber
=
0
;
dev
->
ErrSlotNumber
=
0
;
dev
->
ErrModuleState
=
0
;
dev
->
ErrModuleState
=
0
;
dev
->
PhysIdentNumber
=
0
;
dev
->
PhysIdentNumber
=
0
;
...
@@ -1342,7 +1424,9 @@ int unpack_get_device_state_con(
...
@@ -1342,7 +1424,9 @@ int unpack_get_device_state_con(
}
}
return
PNAK_OK
;
return
PNAK_OK
;
}
else
if
(
pSdb
->
Result
==
PNAK_RESULT_NEG
)
{
}
else
if
(
pSdb
->
Result
==
PNAK_RESULT_NEG
)
{
T_PN_SERVICE_ERROR_CON
*
pErrorCon
=
(
T_PN_SERVICE_ERROR_CON
*
)(
pSdb
+
1
);
T_PN_SERVICE_ERROR_CON
*
pErrorCon
=
(
T_PN_SERVICE_ERROR_CON
*
)(
pSdb
+
1
);
printf
(
"channel %d: get_device_state.con [-] (%d)
\r\n
"
printf
(
"channel %d: get_device_state.con [-] (%d)
\r\n
"
...
@@ -1350,9 +1434,10 @@ int unpack_get_device_state_con(
...
@@ -1350,9 +1434,10 @@ int unpack_get_device_state_con(
" detail : %d (0x%02x)
\r\n
"
" detail : %d (0x%02x)
\r\n
"
" add. detail: %d (0x%02x)
\r\n
"
" add. detail: %d (0x%02x)
\r\n
"
" area : %d (0x%02x)
\r\n
"
,
" area : %d (0x%02x)
\r\n
"
,
0
,
pSdb
->
DeviceRef
,
pErrorCon
->
Code
,
pErrorCon
->
Code
,
pErrorCon
->
Detail
,
0
,
pSdb
->
DeviceRef
,
pErrorCon
->
Code
,
pErrorCon
->
Code
,
pErrorCon
->
Detail
,
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
Detail
,
pErrorCon
->
Detail
,
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
AreaCode
,
pErrorCon
->
AreaCode
);
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
AreaCode
,
pErrorCon
->
AreaCode
);
}
}
return
-
1
;
return
-
1
;
...
@@ -1360,7 +1445,8 @@ int unpack_get_device_state_con(
...
@@ -1360,7 +1445,8 @@ int unpack_get_device_state_con(
int
unpack_download_con
(
T_PNAK_SERVICE_DESCRIPTION
*
pSdb
,
io_sAgentLocal
*
local
)
int
unpack_download_con
(
T_PNAK_SERVICE_DESCRIPTION
*
pSdb
,
io_sAgentLocal
*
local
)
{
{
if
(
pSdb
->
Result
==
PNAK_RESULT_POS
)
{
if
(
pSdb
->
Result
==
PNAK_RESULT_POS
)
{
T_PN_SERVICE_DOWNLOAD_CON
*
pDownloadCon
;
T_PN_SERVICE_DOWNLOAD_CON
*
pDownloadCon
;
T_PN_IOCR_INFO
*
pIOCRInfo
;
T_PN_IOCR_INFO
*
pIOCRInfo
;
...
@@ -1374,8 +1460,10 @@ int unpack_download_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
...
@@ -1374,8 +1460,10 @@ int unpack_download_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
/* Find configured device */
/* Find configured device */
for
(
ii
=
0
;
ii
<
local
->
device_data
.
size
();
ii
++
)
{
for
(
ii
=
0
;
ii
<
local
->
device_data
.
size
();
ii
++
)
if
(
local
->
device_data
[
ii
]
->
device_ref
==
device_ref
)
{
{
if
(
local
->
device_data
[
ii
]
->
device_ref
==
device_ref
)
{
device
=
local
->
device_data
[
ii
];
device
=
local
->
device_data
[
ii
];
break
;
break
;
}
}
...
@@ -1386,13 +1474,14 @@ int unpack_download_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
...
@@ -1386,13 +1474,14 @@ int unpack_download_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
pDownloadCon
=
(
T_PN_SERVICE_DOWNLOAD_CON
*
)(
pSdb
+
1
);
pDownloadCon
=
(
T_PN_SERVICE_DOWNLOAD_CON
*
)(
pSdb
+
1
);
pIOCRInfo
=
(
T_PN_IOCR_INFO
*
)(
pDownloadCon
+
1
);
pIOCRInfo
=
(
T_PN_IOCR_INFO
*
)(
pDownloadCon
+
1
);
NumberIOCRs
=
_HIGH_LOW_BYTES_TO_PN_U16
(
NumberIOCRs
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pDownloadCon
->
NumberOfIOCRHighByte
,
pDownloadCon
->
NumberOfIOCRHighByte
,
pDownloadCon
->
NumberOfIOCRLowByte
);
pDownloadCon
->
NumberOfIOCRLowByte
);
device
->
alarm_ref
=
_HIGH_LOW_BYTES_TO_PN_U16
(
device
->
alarm_ref
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pDownloadCon
->
AlarmRefHighByte
,
pDownloadCon
->
AlarmRefLowByte
);
pDownloadCon
->
AlarmRefHighByte
,
pDownloadCon
->
AlarmRefLowByte
);
for
(
IOCRIndex
=
0u
;
IOCRIndex
<
NumberIOCRs
;
IOCRIndex
++
)
{
for
(
IOCRIndex
=
0u
;
IOCRIndex
<
NumberIOCRs
;
IOCRIndex
++
)
{
T_PN_API_INFO
*
pAPIInfo
=
(
T_PN_API_INFO
*
)(
pIOCRInfo
+
1
);
T_PN_API_INFO
*
pAPIInfo
=
(
T_PN_API_INFO
*
)(
pIOCRInfo
+
1
);
PN_U16
NumberAPIs
;
PN_U16
NumberAPIs
;
PN_U16
APIIndex
;
PN_U16
APIIndex
;
...
@@ -1400,25 +1489,28 @@ int unpack_download_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
...
@@ -1400,25 +1489,28 @@ int unpack_download_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
unsigned
short
type
;
unsigned
short
type
;
type
=
_HIGH_LOW_BYTES_TO_PN_U16
(
type
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pIOCRInfo
->
TypeHighByte
,
pIOCRInfo
->
TypeHighByte
,
pIOCRInfo
->
TypeLowByte
);
pIOCRInfo
->
TypeLowByte
);
for
(
ii
=
0
;
ii
<
device
->
iocr_data
.
size
();
ii
++
)
{
for
(
ii
=
0
;
ii
<
device
->
iocr_data
.
size
();
ii
++
)
if
(
device
->
iocr_data
[
ii
]
->
type
==
type
)
{
{
if
(
device
->
iocr_data
[
ii
]
->
type
==
type
)
{
iocr_data
=
device
->
iocr_data
[
ii
];
iocr_data
=
device
->
iocr_data
[
ii
];
break
;
break
;
}
}
}
}
if
(
ii
==
device
->
iocr_data
.
size
())
{
if
(
ii
==
device
->
iocr_data
.
size
())
{
/* This iocr is not found, log some thing and continue */
/* This iocr is not found, log some thing and continue */
printf
(
"iocr not found %d
\n
"
,
type
);
printf
(
"iocr not found %d
\n
"
,
type
);
continue
;
continue
;
}
}
iocr_data
->
type
=
_HIGH_LOW_BYTES_TO_PN_U16
(
iocr_data
->
type
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pIOCRInfo
->
TypeHighByte
,
pIOCRInfo
->
TypeHighByte
,
pIOCRInfo
->
TypeLowByte
);
pIOCRInfo
->
TypeLowByte
);
iocr_data
->
identifier
=
_HIGH_LOW_BYTES_TO_PN_U16
(
iocr_data
->
identifier
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pIOCRInfo
->
IOCRIdentifierHighByte
,
pIOCRInfo
->
IOCRIdentifierLowByte
);
pIOCRInfo
->
IOCRIdentifierHighByte
,
pIOCRInfo
->
IOCRIdentifierLowByte
);
iocr_data
->
io_data_length
=
_HIGH_LOW_BYTES_TO_PN_U16
(
iocr_data
->
io_data_length
=
_HIGH_LOW_BYTES_TO_PN_U16
(
...
@@ -1432,10 +1524,11 @@ int unpack_download_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
...
@@ -1432,10 +1524,11 @@ int unpack_download_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
// _HIGH_LOW_BYTES_TO_PN_U16 (pIOCRInfo->IODataLengthHighByte,
// _HIGH_LOW_BYTES_TO_PN_U16 (pIOCRInfo->IODataLengthHighByte,
// pIOCRInfo->IODataLengthLowByte));
// pIOCRInfo->IODataLengthLowByte));
NumberAPIs
=
_HIGH_LOW_BYTES_TO_PN_U16
(
NumberAPIs
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pIOCRInfo
->
NumberOfAPIsHighByte
,
pIOCRInfo
->
NumberOfAPIsHighByte
,
pIOCRInfo
->
NumberOfAPIsLowByte
);
pIOCRInfo
->
NumberOfAPIsLowByte
);
for
(
APIIndex
=
0u
;
APIIndex
<
NumberAPIs
;
APIIndex
++
)
{
for
(
APIIndex
=
0u
;
APIIndex
<
NumberAPIs
;
APIIndex
++
)
{
T_PN_DATA_INFO
*
pDataInfo
=
(
T_PN_DATA_INFO
*
)(
pAPIInfo
+
1
);
T_PN_DATA_INFO
*
pDataInfo
=
(
T_PN_DATA_INFO
*
)(
pAPIInfo
+
1
);
PN_U16
NumberIODatas
;
PN_U16
NumberIODatas
;
...
@@ -1452,7 +1545,8 @@ int unpack_download_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
...
@@ -1452,7 +1545,8 @@ int unpack_download_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
NumberIODatas
=
_HIGH_LOW_BYTES_TO_PN_U16
(
NumberIODatas
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pAPIInfo
->
NumberOfIODataHighByte
,
pAPIInfo
->
NumberOfIODataLowByte
);
pAPIInfo
->
NumberOfIODataHighByte
,
pAPIInfo
->
NumberOfIODataLowByte
);
for
(
IODataIndex
=
0u
;
IODataIndex
<
NumberIODatas
;
IODataIndex
++
)
{
for
(
IODataIndex
=
0u
;
IODataIndex
<
NumberIODatas
;
IODataIndex
++
)
{
// printf(" slot: %d subslot: %d offset:
// printf(" slot: %d subslot: %d offset:
//%d\r\n",
//%d\r\n",
// _HIGH_LOW_BYTES_TO_PN_U16
// _HIGH_LOW_BYTES_TO_PN_U16
...
@@ -1463,26 +1557,32 @@ int unpack_download_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
...
@@ -1463,26 +1557,32 @@ int unpack_download_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
// _HIGH_LOW_BYTES_TO_PN_U16 (pDataInfo->OffsetHighByte,
// _HIGH_LOW_BYTES_TO_PN_U16 (pDataInfo->OffsetHighByte,
// pDataInfo->OffsetLowByte));
// pDataInfo->OffsetLowByte));
for
(
ii
=
0
;
ii
<
device
->
module_data
.
size
();
ii
++
)
{
for
(
ii
=
0
;
ii
<
device
->
module_data
.
size
();
ii
++
)
{
PnModuleData
*
module_data
;
PnModuleData
*
module_data
;
module_data
=
device
->
module_data
[
ii
];
module_data
=
device
->
module_data
[
ii
];
if
(
module_data
->
slot_number
if
(
module_data
->
slot_number
==
==
_HIGH_LOW_BYTES_TO_PN_U16
(
pDataInfo
->
SlotNumberHighByte
,
_HIGH_LOW_BYTES_TO_PN_U16
(
pDataInfo
->
SlotNumberHighByte
,
pDataInfo
->
SlotNumberLowByte
))
{
pDataInfo
->
SlotNumberLowByte
))
for
(
jj
=
0
;
jj
<
module_data
->
submodule_data
.
size
();
jj
++
)
{
{
for
(
jj
=
0
;
jj
<
module_data
->
submodule_data
.
size
();
jj
++
)
{
PnSubmoduleData
*
submodule_data
;
PnSubmoduleData
*
submodule_data
;
submodule_data
=
module_data
->
submodule_data
[
jj
];
submodule_data
=
module_data
->
submodule_data
[
jj
];
if
(
submodule_data
->
subslot_number
if
(
submodule_data
->
subslot_number
==
==
_HIGH_LOW_BYTES_TO_PN_U16
(
_HIGH_LOW_BYTES_TO_PN_U16
(
pDataInfo
->
SubSlotNumberHighByte
,
pDataInfo
->
SubSlotNumberHighByte
,
pDataInfo
->
SubSlotNumberLowByte
))
pDataInfo
->
SubSlotNumberLowByte
))
{
{
if
(
PROFINET_IO_CR_TYPE_INPUT
==
type
)
{
if
(
PROFINET_IO_CR_TYPE_INPUT
==
type
)
{
submodule_data
->
offset_io_in
=
_HIGH_LOW_BYTES_TO_PN_U16
(
submodule_data
->
offset_io_in
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pDataInfo
->
OffsetHighByte
,
pDataInfo
->
OffsetLowByte
);
pDataInfo
->
OffsetHighByte
,
pDataInfo
->
OffsetLowByte
);
}
else
{
}
else
{
submodule_data
->
offset_io_out
=
_HIGH_LOW_BYTES_TO_PN_U16
(
submodule_data
->
offset_io_out
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pDataInfo
->
OffsetHighByte
,
pDataInfo
->
OffsetLowByte
);
pDataInfo
->
OffsetHighByte
,
pDataInfo
->
OffsetLowByte
);
}
}
...
@@ -1494,11 +1594,12 @@ int unpack_download_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
...
@@ -1494,11 +1594,12 @@ int unpack_download_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
}
}
// printf (" status\r\n");
// printf (" status\r\n");
NumberIODatas
NumberIODatas
=
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pAPIInfo
->
NumberOfIOStatusHighByte
,
_HIGH_LOW_BYTES_TO_PN_U16
(
pAPIInfo
->
NumberOfIOStatusHighByte
,
pAPIInfo
->
NumberOfIOStatusLowByte
);
pAPIInfo
->
NumberOfIOStatusLowByte
);
for
(
IODataIndex
=
0u
;
IODataIndex
<
NumberIODatas
;
IODataIndex
++
)
{
for
(
IODataIndex
=
0u
;
IODataIndex
<
NumberIODatas
;
IODataIndex
++
)
{
// printf(" slot: %d subslot: %d offset:
// printf(" slot: %d subslot: %d offset:
//%d\r\n",
//%d\r\n",
// _HIGH_LOW_BYTES_TO_PN_U16
// _HIGH_LOW_BYTES_TO_PN_U16
...
@@ -1509,30 +1610,36 @@ int unpack_download_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
...
@@ -1509,30 +1610,36 @@ int unpack_download_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
// _HIGH_LOW_BYTES_TO_PN_U16 (pDataInfo->OffsetHighByte,
// _HIGH_LOW_BYTES_TO_PN_U16 (pDataInfo->OffsetHighByte,
// pDataInfo->OffsetLowByte));
// pDataInfo->OffsetLowByte));
for
(
ii
=
0
;
ii
<
device
->
module_data
.
size
();
ii
++
)
{
for
(
ii
=
0
;
ii
<
device
->
module_data
.
size
();
ii
++
)
{
PnModuleData
*
module_data
;
PnModuleData
*
module_data
;
module_data
=
device
->
module_data
[
ii
];
module_data
=
device
->
module_data
[
ii
];
if
(
module_data
->
slot_number
if
(
module_data
->
slot_number
==
==
_HIGH_LOW_BYTES_TO_PN_U16
(
pDataInfo
->
SlotNumberHighByte
,
_HIGH_LOW_BYTES_TO_PN_U16
(
pDataInfo
->
SlotNumberHighByte
,
pDataInfo
->
SlotNumberLowByte
))
{
pDataInfo
->
SlotNumberLowByte
))
for
(
jj
=
0
;
jj
<
module_data
->
submodule_data
.
size
();
jj
++
)
{
{
for
(
jj
=
0
;
jj
<
module_data
->
submodule_data
.
size
();
jj
++
)
{
PnSubmoduleData
*
submodule_data
;
PnSubmoduleData
*
submodule_data
;
submodule_data
=
module_data
->
submodule_data
[
jj
];
submodule_data
=
module_data
->
submodule_data
[
jj
];
if
(
submodule_data
->
subslot_number
if
(
submodule_data
->
subslot_number
==
==
_HIGH_LOW_BYTES_TO_PN_U16
(
_HIGH_LOW_BYTES_TO_PN_U16
(
pDataInfo
->
SubSlotNumberHighByte
,
pDataInfo
->
SubSlotNumberHighByte
,
pDataInfo
->
SubSlotNumberLowByte
))
pDataInfo
->
SubSlotNumberLowByte
))
{
{
if
(
PROFINET_IO_CR_TYPE_INPUT
==
type
)
{
if
(
PROFINET_IO_CR_TYPE_INPUT
==
type
)
submodule_data
->
offset_status_in
{
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pDataInfo
->
OffsetHighByte
,
submodule_data
->
offset_status_in
=
pDataInfo
->
OffsetLowByte
);
_HIGH_LOW_BYTES_TO_PN_U16
(
pDataInfo
->
OffsetHighByte
,
}
else
{
pDataInfo
->
OffsetLowByte
);
submodule_data
->
offset_status_out
}
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pDataInfo
->
OffsetHighByte
,
else
pDataInfo
->
OffsetLowByte
);
{
submodule_data
->
offset_status_out
=
_HIGH_LOW_BYTES_TO_PN_U16
(
pDataInfo
->
OffsetHighByte
,
pDataInfo
->
OffsetLowByte
);
}
}
}
}
}
}
...
@@ -1548,7 +1655,9 @@ int unpack_download_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
...
@@ -1548,7 +1655,9 @@ int unpack_download_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
}
}
return
PNAK_OK
;
return
PNAK_OK
;
}
else
if
(
pSdb
->
Result
==
PNAK_RESULT_NEG
)
{
}
else
if
(
pSdb
->
Result
==
PNAK_RESULT_NEG
)
{
T_PN_SERVICE_ERROR_CON
*
pErrorCon
=
(
T_PN_SERVICE_ERROR_CON
*
)(
pSdb
+
1
);
T_PN_SERVICE_ERROR_CON
*
pErrorCon
=
(
T_PN_SERVICE_ERROR_CON
*
)(
pSdb
+
1
);
printf
(
"channel %d: download.con [-] (%d)
\r\n
"
printf
(
"channel %d: download.con [-] (%d)
\r\n
"
...
@@ -1556,9 +1665,10 @@ int unpack_download_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
...
@@ -1556,9 +1665,10 @@ int unpack_download_con(T_PNAK_SERVICE_DESCRIPTION* pSdb, io_sAgentLocal* local)
" detail : %d (0x%02x)
\r\n
"
" detail : %d (0x%02x)
\r\n
"
" add. detail: %d (0x%02x)
\r\n
"
" add. detail: %d (0x%02x)
\r\n
"
" area : %d (0x%02x)
\r\n
"
,
" area : %d (0x%02x)
\r\n
"
,
0
,
pSdb
->
DeviceRef
,
pErrorCon
->
Code
,
pErrorCon
->
Code
,
pErrorCon
->
Detail
,
0
,
pSdb
->
DeviceRef
,
pErrorCon
->
Code
,
pErrorCon
->
Code
,
pErrorCon
->
Detail
,
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
Detail
,
pErrorCon
->
Detail
,
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
AreaCode
,
pErrorCon
->
AreaCode
);
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
AreaCode
,
pErrorCon
->
AreaCode
);
}
}
return
-
1
;
return
-
1
;
...
@@ -1572,8 +1682,10 @@ int handle_service_con(io_sAgentLocal* local, io_sAgent* ap)
...
@@ -1572,8 +1682,10 @@ int handle_service_con(io_sAgentLocal* local, io_sAgent* ap)
memset
(
&
local
->
service_con
,
0
,
sizeof
(
T_PNAK_SERVICE_CON
));
memset
(
&
local
->
service_con
,
0
,
sizeof
(
T_PNAK_SERVICE_CON
));
sts
=
pnak_get_service_con
(
0
,
&
local
->
service_con
);
sts
=
pnak_get_service_con
(
0
,
&
local
->
service_con
);
if
(
sts
==
PNAK_NOTIFICATION_RECEIVED
)
{
if
(
sts
==
PNAK_NOTIFICATION_RECEIVED
)
for
(
ii
=
0
;
ii
<
local
->
service_con
.
NumberEntries
;
ii
++
)
{
{
for
(
ii
=
0
;
ii
<
local
->
service_con
.
NumberEntries
;
ii
++
)
{
T_PNAK_SERVICE_DESCRIPTION
*
pSdb
;
T_PNAK_SERVICE_DESCRIPTION
*
pSdb
;
unsigned
int
offset
;
unsigned
int
offset
;
...
@@ -1581,77 +1693,93 @@ int handle_service_con(io_sAgentLocal* local, io_sAgent* ap)
...
@@ -1581,77 +1693,93 @@ int handle_service_con(io_sAgentLocal* local, io_sAgent* ap)
pSdb
=
(
T_PNAK_SERVICE_DESCRIPTION
*
)
&
local
->
service_con
pSdb
=
(
T_PNAK_SERVICE_DESCRIPTION
*
)
&
local
->
service_con
.
ServiceChannel
[
offset
];
.
ServiceChannel
[
offset
];
if
((
pSdb
->
Instance
==
PN
)
||
(
pSdb
->
Instance
==
PN_CONTROLLER
))
{
if
((
pSdb
->
Instance
==
PN
)
||
(
pSdb
->
Instance
==
PN_CONTROLLER
))
switch
(
pSdb
->
Service
)
{
{
switch
(
pSdb
->
Service
)
{
case
PN_SERVICE_DOWNLOAD_EXTENDED
:
case
PN_SERVICE_DOWNLOAD_EXTENDED
:
// printf("EXTENDED DOWNLOAD!\n");
// printf("EXTENDED DOWNLOAD!\n");
case
PN_SERVICE_DOWNLOAD
:
{
case
PN_SERVICE_DOWNLOAD
:
{
// printf("unpack_download_con\n");
// printf("unpack_download_con\n");
sts
=
unpack_download_con
(
pSdb
,
local
);
sts
=
unpack_download_con
(
pSdb
,
local
);
break
;
break
;
}
}
case
PN_SERVICE_SET_IDENTIFICATION
:
case
PN_SERVICE_SET_IDENTIFICATION
:
case
PN_SERVICE_READ
:
{
case
PN_SERVICE_READ
:
{
break
;
break
;
}
}
case
PN_SERVICE_WRITE_MULTIPLE
:
case
PN_SERVICE_WRITE_MULTIPLE
:
// printf("WRITE MULTIPLE!\n");
// printf("WRITE MULTIPLE!\n");
case
PN_SERVICE_WRITE
:
{
case
PN_SERVICE_WRITE
:
{
// printf("unpack_write_con\n");
// printf("unpack_write_con\n");
sts
=
unpack_write_con
(
pSdb
,
local
);
sts
=
unpack_write_con
(
pSdb
,
local
);
break
;
break
;
}
}
case
PN_SERVICE_GET_ALARM
:
{
case
PN_SERVICE_GET_ALARM
:
{
sts
=
unpack_get_alarm_con
(
pSdb
,
local
,
ap
);
sts
=
unpack_get_alarm_con
(
pSdb
,
local
,
ap
);
break
;
break
;
}
}
case
PN_SERVICE_GET_DEVICE_STATE
:
{
case
PN_SERVICE_GET_DEVICE_STATE
:
{
sts
=
unpack_get_device_state_con
(
pSdb
,
local
,
ap
);
sts
=
unpack_get_device_state_con
(
pSdb
,
local
,
ap
);
break
;
break
;
}
}
case
PN_SERVICE_ALARM_ACK
:
{
case
PN_SERVICE_ALARM_ACK
:
{
break
;
break
;
}
}
default:
{
default:
{
printf
(
"channel %d: unhandled service confirmation [0x%x]
\r\n
"
,
0
,
printf
(
"channel %d: unhandled service confirmation [0x%x]
\r\n
"
,
0
,
pSdb
->
Service
);
pSdb
->
Service
);
}
}
}
}
}
else
if
(
pSdb
->
Instance
==
PN_SUPERVISOR
)
{
}
switch
(
pSdb
->
Service
)
{
else
if
(
pSdb
->
Instance
==
PN_SUPERVISOR
)
case
PN_SERVICE_GET_LIST_OF_STATION
:
{
{
switch
(
pSdb
->
Service
)
{
case
PN_SERVICE_GET_LIST_OF_STATION
:
{
sts
=
unpack_get_los_con
(
pSdb
,
local
);
sts
=
unpack_get_los_con
(
pSdb
,
local
);
break
;
break
;
}
}
case
PN_SERVICE_SET_IDENTIFICATION
:
case
PN_SERVICE_SET_IDENTIFICATION
:
case
PN_SERVICE_SET_IP_SETTINGS
:
case
PN_SERVICE_SET_IP_SETTINGS
:
case
PN_SERVICE_SET_DEVICE_NAME
:
{
case
PN_SERVICE_SET_DEVICE_NAME
:
if
(
pSdb
->
Result
==
PNAK_RESULT_NEG
)
{
{
T_PN_SERVICE_ERROR_CON
*
pErrorCon
if
(
pSdb
->
Result
==
PNAK_RESULT_NEG
)
=
(
T_PN_SERVICE_ERROR_CON
*
)(
pSdb
+
1
);
{
T_PN_SERVICE_ERROR_CON
*
pErrorCon
=
(
T_PN_SERVICE_ERROR_CON
*
)(
pSdb
+
1
);
printf
(
"channel %d: get_los.con [-] (%d)
\r\n
"
printf
(
"channel %d: get_los.con [-] (%d)
\r\n
"
" code : %d (0x%02x)
\r\n
"
" code : %d (0x%02x)
\r\n
"
" detail : %d (0x%02x)
\r\n
"
" detail : %d (0x%02x)
\r\n
"
" add. detail: %d (0x%02x)
\r\n
"
" add. detail: %d (0x%02x)
\r\n
"
" area : %d (0x%02x)
\r\n
"
,
" area : %d (0x%02x)
\r\n
"
,
0
,
pSdb
->
DeviceRef
,
pErrorCon
->
Code
,
pErrorCon
->
Code
,
0
,
pSdb
->
DeviceRef
,
pErrorCon
->
Code
,
pErrorCon
->
Code
,
pErrorCon
->
Detail
,
pErrorCon
->
Detail
,
pErrorCon
->
Detail
,
pErrorCon
->
Detail
,
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
AdditionalDetail
,
pErrorCon
->
AreaCode
,
pErrorCon
->
AreaCode
);
pErrorCon
->
AreaCode
,
pErrorCon
->
AreaCode
);
}
}
break
;
break
;
}
}
default:
{
default:
{
printf
(
"channel %d: unhandled service confirmation [0x%x]
\r\n
"
,
0
,
printf
(
"channel %d: unhandled service confirmation [0x%x]
\r\n
"
,
0
,
pSdb
->
Service
);
pSdb
->
Service
);
}
}
}
}
}
}
...
@@ -1671,22 +1799,17 @@ int wait_service_con(io_sAgentLocal* local, io_sAgent* ap)
...
@@ -1671,22 +1799,17 @@ int wait_service_con(io_sAgentLocal* local, io_sAgent* ap)
sts
=
pnak_wait_for_multiple_objects
(
0
,
&
wait_object
,
PNAK_INFINITE_TIMEOUT
);
sts
=
pnak_wait_for_multiple_objects
(
0
,
&
wait_object
,
PNAK_INFINITE_TIMEOUT
);
if
(
sts
==
PNAK_OK
)
{
if
(
sts
==
PNAK_OK
)
{
sts
=
handle_service_con
(
local
,
ap
);
sts
=
handle_service_con
(
local
,
ap
);
}
}
return
sts
;
return
sts
;
}
}
void
handle_exception
(
io_sAgentLocal
*
local
)
void
handle_exception
(
io_sAgentLocal
*
local
)
{
return
;
}
{
return
;
}
void
handle_state_changed
(
io_sAgentLocal
*
local
)
void
handle_state_changed
(
io_sAgentLocal
*
local
)
{
return
;
}
{
return
;
}
void
handle_device_state_changed
(
io_sAgentLocal
*
local
,
io_sAgent
*
ap
)
void
handle_device_state_changed
(
io_sAgentLocal
*
local
,
io_sAgent
*
ap
)
{
{
...
@@ -1696,24 +1819,30 @@ void handle_device_state_changed(io_sAgentLocal* local, io_sAgent* ap)
...
@@ -1696,24 +1819,30 @@ void handle_device_state_changed(io_sAgentLocal* local, io_sAgent* ap)
sts
=
pnak_get_device_state_ind
(
0
,
&
dev_state
);
sts
=
pnak_get_device_state_ind
(
0
,
&
dev_state
);
if
(
sts
==
PNAK_NOTIFICATION_RECEIVED
)
{
if
(
sts
==
PNAK_NOTIFICATION_RECEIVED
)
{
/* Check state for all devices */
/* Check state for all devices */
for
(
ii
=
1
;
ii
<
local
->
device_data
.
size
();
ii
++
)
{
for
(
ii
=
1
;
ii
<
local
->
device_data
.
size
();
ii
++
)
{
// printf("Dev_ref %d, State, %d \r\n", ii, dev_state.State[ii]);
// printf("Dev_ref %d, State, %d \r\n", ii, dev_state.State[ii]);
// for (ii = 0; ii < 1; ii++) {
// for (ii = 0; ii < 1; ii++) {
if
(
dev_state
.
State
[
ii
]
!=
local
->
device_data
[
ii
]
->
device_state
)
{
if
(
dev_state
.
State
[
ii
]
!=
local
->
device_data
[
ii
]
->
device_state
)
{
local
->
device_data
[
ii
]
->
device_state
=
dev_state
.
State
[
ii
];
local
->
device_data
[
ii
]
->
device_state
=
dev_state
.
State
[
ii
];
if
(
ap
)
{
if
(
ap
)
{
/* Find corresponding device */
/* Find corresponding device */
io_sRack
*
slave_list
;
io_sRack
*
slave_list
;
for
(
slave_list
=
ap
->
racklist
,
jj
=
0
;
for
(
slave_list
=
ap
->
racklist
,
jj
=
0
;
(
slave_list
!=
NULL
)
&&
jj
<
ii
-
1
;
(
slave_list
!=
NULL
)
&&
jj
<
ii
-
1
;
slave_list
=
slave_list
->
next
,
jj
++
)
{
slave_list
=
slave_list
->
next
,
jj
++
)
{
}
}
if
(
slave_list
)
{
if
(
slave_list
)
{
pwr_sClass_PnDevice
*
dev
;
pwr_sClass_PnDevice
*
dev
;
dev
=
(
pwr_sClass_PnDevice
*
)
slave_list
->
op
;
dev
=
(
pwr_sClass_PnDevice
*
)
slave_list
->
op
;
dev
->
State
=
dev_state
.
State
[
ii
];
dev
->
State
=
dev_state
.
State
[
ii
];
...
@@ -1724,17 +1853,19 @@ void handle_device_state_changed(io_sAgentLocal* local, io_sAgent* ap)
...
@@ -1724,17 +1853,19 @@ void handle_device_state_changed(io_sAgentLocal* local, io_sAgent* ap)
dev
->
Status
=
PB__NOCONN
;
dev
->
Status
=
PB__NOCONN
;
errh_Info
(
"Profinet - New device state, dev: %s, state: %d"
,
errh_Info
(
"Profinet - New device state, dev: %s, state: %d"
,
slave_list
->
Name
,
dev
->
State
);
slave_list
->
Name
,
dev
->
State
);
}
}
}
}
if
(
dev_state
.
State
[
ii
]
==
PNAK_DEVICE_STATE_CONNECTED
)
{
if
(
dev_state
.
State
[
ii
]
==
PNAK_DEVICE_STATE_CONNECTED
)
pack_get_device_state_req
(
{
&
local
->
service_req_res
,
local
->
device_data
[
ii
]
->
device_ref
);
pack_get_device_state_req
(
&
local
->
service_req_res
,
local
->
device_data
[
ii
]
->
device_ref
);
sts
=
pnak_send_service_req_res
(
0
,
&
local
->
service_req_res
);
sts
=
pnak_send_service_req_res
(
0
,
&
local
->
service_req_res
);
if
(
sts
==
PNAK_OK
)
{
if
(
sts
==
PNAK_OK
)
{
sts
=
wait_service_con
(
local
,
ap
);
sts
=
wait_service_con
(
local
,
ap
);
}
}
}
}
...
@@ -1753,30 +1884,36 @@ void handle_alarm_indication(io_sAgentLocal* local, io_sAgent* ap)
...
@@ -1753,30 +1884,36 @@ void handle_alarm_indication(io_sAgentLocal* local, io_sAgent* ap)
sts
=
pnak_get_alarm_ind
(
0
,
&
pAlarm
);
sts
=
pnak_get_alarm_ind
(
0
,
&
pAlarm
);
if
(
sts
==
PNAK_NOTIFICATION_RECEIVED
)
{
if
(
sts
==
PNAK_NOTIFICATION_RECEIVED
)
for
(
ii
=
0
;
ii
<
local
->
device_data
.
size
();
ii
++
)
{
{
for
(
ii
=
0
;
ii
<
local
->
device_data
.
size
();
ii
++
)
{
index
=
ii
/
8
;
index
=
ii
/
8
;
bit_no
=
ii
%
8
;
bit_no
=
ii
%
8
;
if
(
pAlarm
.
DeviceReference
[
index
]
&
(
1
<<
bit_no
))
{
if
(
pAlarm
.
DeviceReference
[
index
]
&
(
1
<<
bit_no
))
{
printf
(
"New alarm for device: %d
\r\n
"
,
ii
);
printf
(
"New alarm for device: %d
\r\n
"
,
ii
);
pack_get_alarm_req
(
&
local
->
service_req_res
,
pack_get_alarm_req
(
&
local
->
service_req_res
,
local
->
device_data
[
ii
]
->
alarm_ref
,
local
->
device_data
[
ii
]
->
alarm_ref
,
local
->
device_data
[
ii
]
->
device_ref
);
local
->
device_data
[
ii
]
->
device_ref
);
sts
=
pnak_send_service_req_res
(
0
,
&
local
->
service_req_res
);
sts
=
pnak_send_service_req_res
(
0
,
&
local
->
service_req_res
);
if
(
sts
==
PNAK_OK
)
{
if
(
sts
==
PNAK_OK
)
{
sts
=
wait_service_con
(
local
,
ap
);
sts
=
wait_service_con
(
local
,
ap
);
if
(
sts
==
PNAK_OK
)
{
if
(
sts
==
PNAK_OK
)
{
pack_alarm_ack_req
(
&
local
->
service_req_res
,
pack_alarm_ack_req
(
&
local
->
service_req_res
,
local
->
device_data
[
ii
]
->
alarm_ref
,
local
->
device_data
[
ii
]
->
alarm_ref
,
local
->
device_data
[
ii
]
->
alarm_data
.
alarm_prio
,
local
->
device_data
[
ii
]
->
alarm_data
.
alarm_prio
,
local
->
device_data
[
ii
]
->
device_ref
);
local
->
device_data
[
ii
]
->
device_ref
);
sts
=
pnak_send_service_req_res
(
0
,
&
local
->
service_req_res
);
sts
=
pnak_send_service_req_res
(
0
,
&
local
->
service_req_res
);
if
(
sts
==
PNAK_OK
)
{
if
(
sts
==
PNAK_OK
)
{
sts
=
wait_service_con
(
local
,
ap
);
sts
=
wait_service_con
(
local
,
ap
);
}
}
}
}
...
@@ -1844,19 +1981,21 @@ void* handle_events(void* ptr)
...
@@ -1844,19 +1981,21 @@ void* handle_events(void* ptr)
s
=
socket
(
AF_INET
,
SOCK_DGRAM
,
0
);
s
=
socket
(
AF_INET
,
SOCK_DGRAM
,
0
);
strncpy
(
ifr
.
ifr_name
,
op
->
EthernetDevice
,
sizeof
(
ifr
.
ifr_name
));
strncpy
(
ifr
.
ifr_name
,
op
->
EthernetDevice
,
sizeof
(
ifr
.
ifr_name
));
if
(
ioctl
(
s
,
SIOCGIFADDR
,
&
ifr
)
>=
0
)
{
if
(
ioctl
(
s
,
SIOCGIFADDR
,
&
ifr
)
>=
0
)
{
strcpy
(
dev_data
->
ip_address
,
strcpy
(
dev_data
->
ip_address
,
inet_ntoa
(((
struct
sockaddr_in
*
)
&
ifr
.
ifr_addr
)
->
sin_addr
));
inet_ntoa
(((
struct
sockaddr_in
*
)
&
ifr
.
ifr_addr
)
->
sin_addr
));
}
}
if
(
ioctl
(
s
,
SIOCGIFNETMASK
,
&
ifr
)
>=
0
)
{
if
(
ioctl
(
s
,
SIOCGIFNETMASK
,
&
ifr
)
>=
0
)
{
strcpy
(
dev_data
->
subnet_mask
,
strcpy
(
dev_data
->
subnet_mask
,
inet_ntoa
(((
struct
sockaddr_in
*
)
&
ifr
.
ifr_netmask
)
->
sin_addr
));
inet_ntoa
(((
struct
sockaddr_in
*
)
&
ifr
.
ifr_netmask
)
->
sin_addr
));
}
}
sscanf
(
dev_data
->
ip_address
,
"%hhu.%hhu.%hhu.%hhu"
,
&
local
->
ipaddress
[
3
],
sscanf
(
dev_data
->
ip_address
,
"%hhu.%hhu.%hhu.%hhu"
,
&
local
->
ipaddress
[
3
],
&
local
->
ipaddress
[
2
],
&
local
->
ipaddress
[
1
],
&
local
->
ipaddress
[
0
]);
&
local
->
ipaddress
[
2
],
&
local
->
ipaddress
[
1
],
&
local
->
ipaddress
[
0
]);
sscanf
(
dev_data
->
subnet_mask
,
"%hhu.%hhu.%hhu.%hhu"
,
&
local
->
subnetmask
[
3
],
sscanf
(
dev_data
->
subnet_mask
,
"%hhu.%hhu.%hhu.%hhu"
,
&
local
->
subnetmask
[
3
],
&
local
->
subnetmask
[
2
],
&
local
->
subnetmask
[
1
],
&
local
->
subnetmask
[
0
]);
&
local
->
subnetmask
[
2
],
&
local
->
subnetmask
[
1
],
&
local
->
subnetmask
[
0
]);
strcpy
(
dev_data
->
device_name
,
hname
);
strcpy
(
dev_data
->
device_name
,
hname
);
dev_data
->
device_num
=
PN_DEVICE_REFERENCE_THIS_STATION
;
dev_data
->
device_num
=
PN_DEVICE_REFERENCE_THIS_STATION
;
...
@@ -1878,58 +2017,65 @@ void* handle_events(void* ptr)
...
@@ -1878,58 +2017,65 @@ void* handle_events(void* ptr)
/* Iterate over the slaves. */
/* Iterate over the slaves. */
for
(
slave_list
=
ap
->
racklist
,
ii
=
0
;
slave_list
!=
NULL
;
for
(
slave_list
=
ap
->
racklist
,
ii
=
0
;
slave_list
!=
NULL
;
slave_list
=
slave_list
->
next
,
ii
++
)
{
slave_list
=
slave_list
->
next
,
ii
++
)
{
dev_data
=
new
GsdmlDeviceData
;
dev_data
=
new
GsdmlDeviceData
;
pn_dev_data
=
new
PnDeviceData
;
pn_dev_data
=
new
PnDeviceData
;
sprintf
(
fname
,
"%s/pwr_pn_%s.xml"
,
env
,
sprintf
(
fname
,
"%s/pwr_pn_%s.xml"
,
env
,
cdh_ObjidToFnString
(
NULL
,
slave_list
->
Objid
));
cdh_ObjidToFnString
(
NULL
,
slave_list
->
Objid
));
dev_data
->
read
(
fname
);
dev_data
->
read
(
fname
);
device_vect
.
push_back
(
dev_data
);
device_vect
.
push_back
(
dev_data
);
pn_dev_data
->
device_ref
=
ii
+
1
;
pn_dev_data
->
device_ref
=
ii
+
1
;
for
(
jj
=
0
;
jj
<
dev_data
->
iocr_data
.
size
();
jj
++
)
{
for
(
jj
=
0
;
jj
<
dev_data
->
iocr_data
.
size
();
jj
++
)
{
pn_iocr_data
=
new
PnIOCRData
;
pn_iocr_data
=
new
PnIOCRData
;
pn_iocr_data
->
type
=
dev_data
->
iocr_data
[
jj
]
->
type
;
pn_iocr_data
->
type
=
dev_data
->
iocr_data
[
jj
]
->
type
;
pn_dev_data
->
iocr_data
.
push_back
(
pn_iocr_data
);
pn_dev_data
->
iocr_data
.
push_back
(
pn_iocr_data
);
}
}
num_modules
=
0
;
num_modules
=
0
;
for
(
jj
=
0
;
jj
<
dev_data
->
slot_data
.
size
();
jj
++
)
{
for
(
jj
=
0
;
jj
<
dev_data
->
slot_data
.
size
();
jj
++
)
{
if
((
dev_data
->
slot_data
[
jj
]
->
module_enum_number
!=
0
)
||
(
jj
==
0
))
if
((
dev_data
->
slot_data
[
jj
]
->
module_enum_number
!=
0
)
||
(
jj
==
0
))
num_modules
++
;
num_modules
++
;
else
else
break
;
break
;
}
}
for
(
jj
=
0
;
jj
<
num_modules
;
jj
++
)
{
for
(
jj
=
0
;
jj
<
num_modules
;
jj
++
)
{
pn_slot_data
=
new
PnModuleData
;
pn_slot_data
=
new
PnModuleData
;
pn_slot_data
->
slot_number
=
dev_data
->
slot_data
[
jj
]
->
slot_number
;
pn_slot_data
->
slot_number
=
dev_data
->
slot_data
[
jj
]
->
slot_number
;
pn_slot_data
->
ident_number
=
dev_data
->
slot_data
[
jj
]
->
module_ident_number
;
pn_slot_data
->
ident_number
=
dev_data
->
slot_data
[
jj
]
->
module_ident_number
;
pn_dev_data
->
module_data
.
push_back
(
pn_slot_data
);
pn_dev_data
->
module_data
.
push_back
(
pn_slot_data
);
for
(
kk
=
0
;
kk
<
dev_data
->
slot_data
[
jj
]
->
subslot_data
.
size
();
kk
++
)
{
for
(
kk
=
0
;
kk
<
dev_data
->
slot_data
[
jj
]
->
subslot_data
.
size
();
kk
++
)
{
pn_subslot_data
=
new
PnSubmoduleData
;
pn_subslot_data
=
new
PnSubmoduleData
;
pn_subslot_data
->
subslot_number
pn_subslot_data
->
subslot_number
=
=
dev_data
->
slot_data
[
jj
]
->
subslot_data
[
kk
]
->
subslot_number
;
dev_data
->
slot_data
[
jj
]
->
subslot_data
[
kk
]
->
subslot_number
;
pn_subslot_data
->
ident_number
pn_subslot_data
->
ident_number
=
=
dev_data
->
slot_data
[
jj
]
->
subslot_data
[
kk
]
->
submodule_ident_number
;
dev_data
->
slot_data
[
jj
]
->
subslot_data
[
kk
]
->
submodule_ident_number
;
pn_subslot_data
->
api
=
dev_data
->
slot_data
[
jj
]
->
subslot_data
[
kk
]
->
api
;
pn_subslot_data
->
api
=
dev_data
->
slot_data
[
jj
]
->
subslot_data
[
kk
]
->
api
;
if
(
dev_data
->
slot_data
[
jj
]
->
subslot_data
[
kk
]
->
io_input_length
>
0
)
{
if
(
dev_data
->
slot_data
[
jj
]
->
subslot_data
[
kk
]
->
io_input_length
>
0
)
pn_subslot_data
->
io_in_data_length
{
=
dev_data
->
slot_data
[
jj
]
->
subslot_data
[
kk
]
->
io_input_length
;
pn_subslot_data
->
io_in_data_length
=
dev_data
->
slot_data
[
jj
]
->
subslot_data
[
kk
]
->
io_input_length
;
pn_subslot_data
->
type
=
PROFINET_IO_SUBMODULE_TYPE_INPUT
;
pn_subslot_data
->
type
=
PROFINET_IO_SUBMODULE_TYPE_INPUT
;
}
}
if
(
dev_data
->
slot_data
[
jj
]
->
subslot_data
[
kk
]
->
io_output_length
>
0
)
{
if
(
dev_data
->
slot_data
[
jj
]
->
subslot_data
[
kk
]
->
io_output_length
>
0
)
pn_subslot_data
->
io_out_data_length
{
=
dev_data
->
slot_data
[
jj
]
->
subslot_data
[
kk
]
->
io_output_length
;
pn_subslot_data
->
io_out_data_length
=
dev_data
->
slot_data
[
jj
]
->
subslot_data
[
kk
]
->
io_output_length
;
pn_subslot_data
->
type
|=
PROFINET_IO_SUBMODULE_TYPE_OUTPUT
;
pn_subslot_data
->
type
|=
PROFINET_IO_SUBMODULE_TYPE_OUTPUT
;
}
}
if
((
dev_data
->
slot_data
[
jj
]
->
subslot_data
[
kk
]
->
io_output_length
>
0
)
if
((
dev_data
->
slot_data
[
jj
]
->
subslot_data
[
kk
]
->
io_output_length
>
0
)
&&
&&
(
dev_data
->
slot_data
[
jj
]
->
subslot_data
[
kk
]
->
io_input_length
(
dev_data
->
slot_data
[
jj
]
->
subslot_data
[
kk
]
->
io_input_length
>
0
))
>
0
))
{
{
pn_subslot_data
->
type
|=
PROFINET_IO_SUBMODULE_TYPE_INPUT_AND_OUTPUT
;
pn_subslot_data
->
type
|=
PROFINET_IO_SUBMODULE_TYPE_INPUT_AND_OUTPUT
;
}
}
...
@@ -1943,7 +2089,8 @@ void* handle_events(void* ptr)
...
@@ -1943,7 +2089,8 @@ void* handle_events(void* ptr)
sts
=
pnak_start_profistack
(
0
,
PNAK_CONTROLLER_MODE
);
sts
=
pnak_start_profistack
(
0
,
PNAK_CONTROLLER_MODE
);
if
(
sts
!=
PNAK_OK
)
{
if
(
sts
!=
PNAK_OK
)
{
op
->
Status
=
PB__INITFAIL
;
op
->
Status
=
PB__INITFAIL
;
errh_Error
(
"Starting profistack returned with error code: %d"
,
sts
);
errh_Error
(
"Starting profistack returned with error code: %d"
,
sts
);
// return IO__ERRINIDEVICE;
// return IO__ERRINIDEVICE;
...
@@ -1951,60 +2098,73 @@ void* handle_events(void* ptr)
...
@@ -1951,60 +2098,73 @@ void* handle_events(void* ptr)
/* Download configuration for all devices */
/* Download configuration for all devices */
for
(
ii
=
0
;
ii
<
device_vect
.
size
();
ii
++
)
{
for
(
ii
=
0
;
ii
<
device_vect
.
size
();
ii
++
)
{
// for (ii = 0; ii < 1; ii++) {
// for (ii = 0; ii < 1; ii++) {
pack_download_req
(
&
local
->
service_req_res
,
device_vect
[
ii
],
pack_download_req
(
&
local
->
service_req_res
,
device_vect
[
ii
],
local
->
device_data
[
ii
]
->
device_ref
);
local
->
device_data
[
ii
]
->
device_ref
);
sts
=
pnak_send_service_req_res
(
0
,
&
local
->
service_req_res
);
sts
=
pnak_send_service_req_res
(
0
,
&
local
->
service_req_res
);
if
(
sts
==
PNAK_OK
)
{
if
(
sts
==
PNAK_OK
)
{
sts
=
wait_service_con
(
local
,
ap
);
sts
=
wait_service_con
(
local
,
ap
);
if
(
sts
==
PNAK_OK
)
{
if
(
sts
==
PNAK_OK
)
{
/* Loop through devices and calculate offset for io */
/* Loop through devices and calculate offset for io */
for
(
jj
=
0
;
jj
<
local
->
device_data
[
ii
]
->
iocr_data
.
size
();
jj
++
)
{
for
(
jj
=
0
;
jj
<
local
->
device_data
[
ii
]
->
iocr_data
.
size
();
jj
++
)
{
offset_inputs
=
0
;
offset_inputs
=
0
;
offset_outputs
=
0
;
offset_outputs
=
0
;
type
=
local
->
device_data
[
ii
]
->
iocr_data
[
jj
]
->
type
;
type
=
local
->
device_data
[
ii
]
->
iocr_data
[
jj
]
->
type
;
for
(
kk
=
0
;
kk
<
local
->
device_data
[
ii
]
->
module_data
.
size
();
kk
++
)
{
for
(
kk
=
0
;
kk
<
local
->
device_data
[
ii
]
->
module_data
.
size
();
kk
++
)
for
(
ll
=
0
;
ll
<
local
->
device_data
[
ii
]
{
->
module_data
[
kk
]
for
(
ll
=
0
;
->
submodule_data
.
size
();
ll
<
ll
++
)
{
local
->
device_data
[
ii
]
->
module_data
[
kk
]
->
submodule_data
.
size
();
ll
++
)
{
PnSubmoduleData
*
submodule
;
PnSubmoduleData
*
submodule
;
submodule
submodule
=
=
local
->
device_data
[
ii
]
->
module_data
[
kk
]
->
submodule_data
[
ll
];
local
->
device_data
[
ii
]
->
module_data
[
kk
]
->
submodule_data
[
ll
];
if
((
type
==
PROFINET_IO_CR_TYPE_INPUT
)
if
((
type
==
PROFINET_IO_CR_TYPE_INPUT
)
&&
&&
((
submodule
->
type
==
PROFINET_IO_SUBMODULE_TYPE_INPUT
)
((
submodule
->
type
==
PROFINET_IO_SUBMODULE_TYPE_INPUT
)
||
||
(
submodule
->
type
(
submodule
->
type
==
==
PROFINET_IO_SUBMODULE_TYPE_INPUT_AND_OUTPUT
)))
{
PROFINET_IO_SUBMODULE_TYPE_INPUT_AND_OUTPUT
)))
{
submodule
->
offset_clean_io_in
=
offset_inputs
;
submodule
->
offset_clean_io_in
=
offset_inputs
;
offset_inputs
+=
submodule
->
io_in_data_length
;
offset_inputs
+=
submodule
->
io_in_data_length
;
}
else
if
((
type
==
PROFINET_IO_CR_TYPE_OUTPUT
)
}
&&
((
submodule
->
type
==
PROFINET_IO_SUBMODULE_TYPE_OUTPUT
)
else
if
((
type
==
PROFINET_IO_CR_TYPE_OUTPUT
)
&&
||
(
submodule
->
type
((
submodule
->
type
==
==
PROFINET_IO_SUBMODULE_TYPE_INPUT_AND_OUTPUT
)))
{
PROFINET_IO_SUBMODULE_TYPE_OUTPUT
)
||
(
submodule
->
type
==
PROFINET_IO_SUBMODULE_TYPE_INPUT_AND_OUTPUT
)))
{
submodule
->
offset_clean_io_out
=
offset_outputs
;
submodule
->
offset_clean_io_out
=
offset_outputs
;
offset_outputs
+=
submodule
->
io_out_data_length
;
offset_outputs
+=
submodule
->
io_out_data_length
;
}
}
}
}
}
}
local
->
device_data
[
ii
]
->
iocr_data
[
jj
]
->
clean_io_data
local
->
device_data
[
ii
]
->
iocr_data
[
jj
]
->
clean_io_data
=
=
(
unsigned
char
*
)
calloc
(
1
,
offset_inputs
+
offset_outputs
);
(
unsigned
char
*
)
calloc
(
1
,
offset_inputs
+
offset_outputs
);
local
->
device_data
[
ii
]
->
iocr_data
[
jj
]
->
clean_io_data_length
local
->
device_data
[
ii
]
->
iocr_data
[
jj
]
->
clean_io_data_length
=
=
offset_inputs
+
offset_outputs
;
offset_inputs
+
offset_outputs
;
}
}
}
else
{
}
else
{
errh_Error
(
"Download of Profinet Device configuration failed for: %s"
,
errh_Error
(
"Download of Profinet Device configuration failed for: %s"
,
device_vect
[
ii
]
->
device_name
);
device_vect
[
ii
]
->
device_name
);
/* Setup a dummy i/o area. Depending on exisiting channels this area
/* Setup a dummy i/o area. Depending on exisiting channels this area
* needs to exist */
* needs to exist */
for
(
jj
=
0
;
jj
<
local
->
device_data
[
ii
]
->
iocr_data
.
size
();
jj
++
)
{
for
(
jj
=
0
;
jj
<
local
->
device_data
[
ii
]
->
iocr_data
.
size
();
jj
++
)
local
->
device_data
[
ii
]
->
iocr_data
[
jj
]
->
clean_io_data
{
=
(
unsigned
char
*
)
calloc
(
1
,
PROFINET_IO_DATA_MAX_LENGTH
);
local
->
device_data
[
ii
]
->
iocr_data
[
jj
]
->
clean_io_data
=
(
unsigned
char
*
)
calloc
(
1
,
PROFINET_IO_DATA_MAX_LENGTH
);
}
}
}
}
}
}
...
@@ -2013,23 +2173,28 @@ void* handle_events(void* ptr)
...
@@ -2013,23 +2173,28 @@ void* handle_events(void* ptr)
/* Loop trough devices and set up i/o */
/* Loop trough devices and set up i/o */
for
(
slave_list
=
ap
->
racklist
,
ii
=
0
;
slave_list
!=
NULL
;
for
(
slave_list
=
ap
->
racklist
,
ii
=
0
;
slave_list
!=
NULL
;
slave_list
=
slave_list
->
next
,
ii
++
)
{
slave_list
=
slave_list
->
next
,
ii
++
)
{
slave_list
->
Local
=
(
unsigned
char
*
)
calloc
(
1
,
sizeof
(
io_sPnRackLocal
));
slave_list
->
Local
=
(
unsigned
char
*
)
calloc
(
1
,
sizeof
(
io_sPnRackLocal
));
r_local
=
(
io_sPnRackLocal
*
)
slave_list
->
Local
;
r_local
=
(
io_sPnRackLocal
*
)
slave_list
->
Local
;
for
(
jj
=
0
;
jj
<
local
->
device_data
[
ii
+
1
]
->
iocr_data
.
size
();
jj
++
)
{
for
(
jj
=
0
;
jj
<
local
->
device_data
[
ii
+
1
]
->
iocr_data
.
size
();
jj
++
)
if
(
local
->
device_data
[
ii
+
1
]
->
iocr_data
[
jj
]
->
type
{
==
PROFINET_IO_CR_TYPE_INPUT
)
{
if
(
local
->
device_data
[
ii
+
1
]
->
iocr_data
[
jj
]
->
type
==
r_local
->
bytes_of_input
PROFINET_IO_CR_TYPE_INPUT
)
=
local
->
device_data
[
ii
+
1
]
->
iocr_data
[
jj
]
->
clean_io_data_length
;
{
r_local
->
inputs
r_local
->
bytes_of_input
=
=
local
->
device_data
[
ii
+
1
]
->
iocr_data
[
jj
]
->
clean_io_data
;
local
->
device_data
[
ii
+
1
]
->
iocr_data
[
jj
]
->
clean_io_data_length
;
}
else
if
(
local
->
device_data
[
ii
+
1
]
->
iocr_data
[
jj
]
->
type
r_local
->
inputs
=
==
PROFINET_IO_CR_TYPE_OUTPUT
)
{
local
->
device_data
[
ii
+
1
]
->
iocr_data
[
jj
]
->
clean_io_data
;
r_local
->
bytes_of_output
}
=
local
->
device_data
[
ii
+
1
]
->
iocr_data
[
jj
]
->
clean_io_data_length
;
else
if
(
local
->
device_data
[
ii
+
1
]
->
iocr_data
[
jj
]
->
type
==
r_local
->
outputs
PROFINET_IO_CR_TYPE_OUTPUT
)
=
local
->
device_data
[
ii
+
1
]
->
iocr_data
[
jj
]
->
clean_io_data
;
{
r_local
->
bytes_of_output
=
local
->
device_data
[
ii
+
1
]
->
iocr_data
[
jj
]
->
clean_io_data_length
;
r_local
->
outputs
=
local
->
device_data
[
ii
+
1
]
->
iocr_data
[
jj
]
->
clean_io_data
;
}
}
}
}
}
}
...
@@ -2040,7 +2205,8 @@ void* handle_events(void* ptr)
...
@@ -2040,7 +2205,8 @@ void* handle_events(void* ptr)
sts
=
pnak_send_service_req_res
(
0
,
&
local
->
service_req_res
);
sts
=
pnak_send_service_req_res
(
0
,
&
local
->
service_req_res
);
if
(
sts
==
PNAK_OK
)
{
if
(
sts
==
PNAK_OK
)
{
sts
=
wait_service_con
(
local
,
ap
);
sts
=
wait_service_con
(
local
,
ap
);
}
}
...
@@ -2052,7 +2218,8 @@ void* handle_events(void* ptr)
...
@@ -2052,7 +2218,8 @@ void* handle_events(void* ptr)
sts
=
pnak_set_mode
(
0
,
&
pMode
);
sts
=
pnak_set_mode
(
0
,
&
pMode
);
if
(
sts
!=
PNAK_OK
)
{
if
(
sts
!=
PNAK_OK
)
{
op
->
Status
=
PB__INITFAIL
;
op
->
Status
=
PB__INITFAIL
;
errh_Error
(
"Profistack unable to go online, errcode: %d"
,
sts
);
errh_Error
(
"Profistack unable to go online, errcode: %d"
,
sts
);
// return IO__ERRINIDEVICE;
// return IO__ERRINIDEVICE;
...
@@ -2064,13 +2231,16 @@ void* handle_events(void* ptr)
...
@@ -2064,13 +2231,16 @@ void* handle_events(void* ptr)
sts
=
pnak_wait_for_multiple_objects
(
0
,
&
wait_object
,
PNAK_INFINITE_TIMEOUT
);
sts
=
pnak_wait_for_multiple_objects
(
0
,
&
wait_object
,
PNAK_INFINITE_TIMEOUT
);
if
(
sts
==
PNAK_OK
)
{
if
(
sts
==
PNAK_OK
)
{
T_PNAK_EVENT_STATE
pState
;
T_PNAK_EVENT_STATE
pState
;
sts
=
pnak_get_state
(
0
,
&
pState
);
sts
=
pnak_get_state
(
0
,
&
pState
);
if
(
pState
.
Mode
!=
PNAK_MODE_ONLINE
)
{
if
(
pState
.
Mode
!=
PNAK_MODE_ONLINE
)
if
(
sts
!=
PNAK_OK
)
{
{
if
(
sts
!=
PNAK_OK
)
{
op
->
Status
=
PB__INITFAIL
;
op
->
Status
=
PB__INITFAIL
;
errh_Error
(
"Profistack unable to set state online, errcode: %d"
,
sts
);
errh_Error
(
"Profistack unable to set state online, errcode: %d"
,
sts
);
// return IO__ERRINIDEVICE;
// return IO__ERRINIDEVICE;
...
@@ -2085,7 +2255,8 @@ void* handle_events(void* ptr)
...
@@ -2085,7 +2255,8 @@ void* handle_events(void* ptr)
memset
(
&
set_dev_state
,
0
,
sizeof
(
set_dev_state
));
memset
(
&
set_dev_state
,
0
,
sizeof
(
set_dev_state
));
for
(
ii
=
0
;
ii
<
local
->
device_data
.
size
();
ii
++
)
{
for
(
ii
=
0
;
ii
<
local
->
device_data
.
size
();
ii
++
)
{
index
=
ii
/
8
;
index
=
ii
/
8
;
bit_no
=
ii
%
8
;
bit_no
=
ii
%
8
;
set_dev_state
.
ActivateDeviceReference
[
index
]
|=
(
1
<<
bit_no
);
set_dev_state
.
ActivateDeviceReference
[
index
]
|=
(
1
<<
bit_no
);
...
@@ -2093,7 +2264,8 @@ void* handle_events(void* ptr)
...
@@ -2093,7 +2264,8 @@ void* handle_events(void* ptr)
sts
=
pnak_set_device_state
(
0
,
&
set_dev_state
);
sts
=
pnak_set_device_state
(
0
,
&
set_dev_state
);
if
(
sts
!=
PNAK_OK
)
{
if
(
sts
!=
PNAK_OK
)
{
op
->
Status
=
PB__INITFAIL
;
op
->
Status
=
PB__INITFAIL
;
errh_Error
(
"Profistack unable to activate devices, errcode: %d"
,
sts
);
errh_Error
(
"Profistack unable to activate devices, errcode: %d"
,
sts
);
// return IO__ERRINIDEVICE;
// return IO__ERRINIDEVICE;
...
@@ -2101,14 +2273,16 @@ void* handle_events(void* ptr)
...
@@ -2101,14 +2273,16 @@ void* handle_events(void* ptr)
/* Check state for all devices */
/* Check state for all devices */
for
(
ii
=
1
;
ii
<
device_vect
.
size
();
ii
++
)
{
for
(
ii
=
1
;
ii
<
device_vect
.
size
();
ii
++
)
{
// for (ii = 0; ii < 1; ii++) {
// for (ii = 0; ii < 1; ii++) {
pack_get_device_state_req
(
pack_get_device_state_req
(
&
local
->
service_req_res
,
&
local
->
service_req_res
,
local
->
device_data
[
ii
]
->
device_ref
);
local
->
device_data
[
ii
]
->
device_ref
);
sts
=
pnak_send_service_req_res
(
0
,
&
local
->
service_req_res
);
sts
=
pnak_send_service_req_res
(
0
,
&
local
->
service_req_res
);
if
(
sts
==
PNAK_OK
)
{
if
(
sts
==
PNAK_OK
)
{
sts
=
wait_service_con
(
local
,
ap
);
sts
=
wait_service_con
(
local
,
ap
);
}
}
}
}
...
@@ -2118,35 +2292,41 @@ void* handle_events(void* ptr)
...
@@ -2118,35 +2292,41 @@ void* handle_events(void* ptr)
/* Do forever ... */
/* Do forever ... */
while
(
1
)
{
while
(
1
)
{
// wait_object = PNAK_WAIT_OBJECTS_EVENT_IND | PNAK_WAIT_OBJECTS_OTHER
// wait_object = PNAK_WAIT_OBJECTS_EVENT_IND | PNAK_WAIT_OBJECTS_OTHER
// | PNAK_WAIT_OBJECT_SERVICE_CON;
// | PNAK_WAIT_OBJECT_SERVICE_CON;
wait_object
=
PNAK_WAIT_OBJECTS_ALL
wait_object
=
PNAK_WAIT_OBJECTS_ALL
&
&
~
(
PNAK_WAIT_OBJECT_PROVIDER_DATA_UPDATED
~
(
PNAK_WAIT_OBJECT_PROVIDER_DATA_UPDATED
|
|
PNAK_WAIT_OBJECT_CONSUMER_DATA_CHANGED
);
PNAK_WAIT_OBJECT_CONSUMER_DATA_CHANGED
);
// pthread_mutex_lock(&local->mutex);
// pthread_mutex_lock(&local->mutex);
sts
=
pnak_wait_for_multiple_objects
(
sts
=
0
,
&
wait_object
,
PNAK_INFINITE_TIMEOUT
);
pnak_wait_for_multiple_objects
(
0
,
&
wait_object
,
PNAK_INFINITE_TIMEOUT
);
if
(
sts
==
PNAK_OK
)
{
if
(
sts
==
PNAK_OK
)
if
(
wait_object
&
PNAK_WAIT_OBJECT_EXCEPTION
)
{
{
if
(
wait_object
&
PNAK_WAIT_OBJECT_EXCEPTION
)
{
// printf("Exception !!\n");
// printf("Exception !!\n");
handle_exception
(
local
);
handle_exception
(
local
);
}
}
else
if
(
wait_object
&
PNAK_WAIT_OBJECT_STATE_CHANGED
)
{
else
if
(
wait_object
&
PNAK_WAIT_OBJECT_STATE_CHANGED
)
{
// printf("State changed !!\n");
// printf("State changed !!\n");
handle_state_changed
(
local
);
handle_state_changed
(
local
);
}
}
else
if
(
wait_object
&
PNAK_WAIT_OBJECT_DEVICE_STATE_CHANGED
)
{
else
if
(
wait_object
&
PNAK_WAIT_OBJECT_DEVICE_STATE_CHANGED
)
{
// printf("Device state changed !!\n");
// printf("Device state changed !!\n");
handle_device_state_changed
(
local
,
ap
);
handle_device_state_changed
(
local
,
ap
);
}
}
else
if
(
wait_object
&
PNAK_WAIT_OBJECT_ALARM
)
{
else
if
(
wait_object
&
PNAK_WAIT_OBJECT_ALARM
)
{
// printf("Alarm !!\n");
// printf("Alarm !!\n");
handle_alarm_indication
(
local
,
ap
);
handle_alarm_indication
(
local
,
ap
);
}
}
...
@@ -2166,7 +2346,8 @@ void* handle_events(void* ptr)
...
@@ -2166,7 +2346,8 @@ void* handle_events(void* ptr)
// // What to do if interrupted ???;
// // What to do if interrupted ???;
// }
// }
else
if
(
wait_object
&
PNAK_WAIT_OBJECT_SERVICE_CON
)
{
else
if
(
wait_object
&
PNAK_WAIT_OBJECT_SERVICE_CON
)
{
// printf("Service con !!\n");
// printf("Service con !!\n");
sts
=
handle_service_con
(
local
,
ap
);
sts
=
handle_service_con
(
local
,
ap
);
}
}
...
@@ -2174,11 +2355,14 @@ void* handle_events(void* ptr)
...
@@ -2174,11 +2355,14 @@ void* handle_events(void* ptr)
// {
// {
// printf("Unhandled status!! 0x%02X\n", wait_object);
// printf("Unhandled status!! 0x%02X\n", wait_object);
// }
// }
}
else
if
((
sts
==
PNAK_ERR_FATAL_ERROR
)
}
||
(
sts
==
PNAK_EXCEPTION_THROWN
))
{
else
if
((
sts
==
PNAK_ERR_FATAL_ERROR
)
||
(
sts
==
PNAK_EXCEPTION_THROWN
))
{
printf
(
"Err Fatal / Exception !!
\n
"
);
printf
(
"Err Fatal / Exception !!
\n
"
);
// user_handle_exception (ChannelId);
// user_handle_exception (ChannelId);
}
else
{
}
else
{
printf
(
"Running == NOT !!
\n
"
);
printf
(
"Running == NOT !!
\n
"
);
// pThisSmObject->Running = PN_FALSE;
// pThisSmObject->Running = PN_FALSE;
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment