(04) Theory : Driver
Contents
Requirements
API or Driver
The layered driver model
Data flow
The ComDrv classes
A simple driver
Driver requirements
Handle communication with peripheral device
Depends on the protocol only, not on the specific device
May handle any number of datapoints of any type
Performs conversion and smoothing
Driver info
How does a driver know
What values to send?
Where to send them to?
How to send them?
How to handle received data?
Answer: Driver specific configs
_address
_smooth, _cmd_conv, _msg_conv
Driver configs
Distribution Config (Event manager)
Specifies Driver Number
Address Config (Driver)
Reference (Address String)
Subindex
Transport Direction and - Mode
Transformation
Address config
Address configs tell the driver
What datapoints are of interest
Where to find the hardware value
How to transform between WinCC OA Variables
and hardware representation
and much more...
Example of an address mapping
PLC
DB0
DB1
DW2
...
DB3
Valve
DW0
DW1
DB2
WinCC OA
DB1DW1
Cmd
Rm
State
Value
DB1DW1
Example for Address Mapping
Variables in SPS
identified by Index
Address string identifies
KR and IX
Profibus SPS identified
by KR
Conversion configs
Conversion configs tell the driver, how to
convert Raw Value <--> Eng. Value
Polynom 4th degree
Spline
Logarithms
and more...
Smoothing configs
Smoothing configs tell the driver, when not to
send values
Compare old and new value
Compare the time received
Flutter suppression
and more...
10
Modularity
Modularity
WinCC OA Data
Conversion and
Smoothing
Software Protocol,
Telegram Layer
HW Protocol, Kernel
Driver
WinCC OA
Smoothing
Conversion
Transformation
Old/New
HW
11
Other tasks
Communication tasks
Interface configuration and initialisation
(Re) connect to device
Bi-directional data conversion
(High Level) Conversion and smoothing
Connection state supervision
12
Other tasks
WinCC OA Communication tasks
(Re) connect to Event manager
(Re) connect to output datapoints
Error logging and protocol
13
Driver compared to API
Use API when
There is only one (or few) device type
Each device can be represented by
a specific DP type
But: There is no API device class
14
Driver compared to API
Use Driver when
There are different device types
There is no easy match between DPE and HW
The device values are represented by any DPE
Most work is done in the ComDrv classes
15
WinCC OA Driver
HW independent
WinCC OA
Parameterization
Request /Response
Polling
Message conversion
Connection administr.
Command conversion
HW dependant
Mapper
Smoothing
Mapping of periphery address to hardware address
Transformation
HWService
Hardware Interface:
general query
Command
Single query
Spontaneous notification
Periphery
16
ComDrv classes
HWMapper
DrvManager
Communication
DP Lookup
DrvDpCont
Transformation
Configs, Conversion
HWService
Hardware
SPS
17
ComDrv Classes: DrvManager
Handle Communication with Event manager
General processing of read- and write commands
and notifications (call of appropriate classes)
Derive your own class from DrvManager to install
your helper classes
18
ComDrv Classes: DrvDpCont
Container for the driver specific configs
Handle smoothing and conversion (configs)
Handle transformation between raw values and
WinCC OA Variables via transformation classes.
Usually not derived by specific driver
19
ComDrv Classes: Transformation
Transformation between raw value and WinCC OA
Variable representation
Called from the DrvDpCont class
One specific class needed for each data type
Each config contains a transformation object.
20
ComDrv Classes: HWMapper
Maps DPE to HW address
Manages lists DpId <--> Address config to
access Configs either by name or by DpId
Manages lists WinCC OA <--> HW address to
convert between logical address (name) and
real address (any format)
N configs with same name and different subix
correspond to one HW address
21
HWMapper lists
WinCC OA
HWMapDpPa
DpId
Addr
Your part
N
HWObject
Addr
HW
22
HWMapper Access Functions
Search for HWObject
findHWObject: Search by HW-Address
findHWAddr: Search by WinCC OA-Address
getFirstComponentIndex(HWObject *): Search by
HW-Address and component
get4Component(HWObject *, long idx): Iterate
over HWObject for one component
23
HWMapper Access Functions
Search for DpId / Configs
getFirstIndex(HWObject *) Index of config with
lowest subindex with matching name
getConfigPtr([HWObject *, ] long idx)
Get config at position idx.
Optional: Only if the name matches
24
HWMapper Update Functions
Update Lists
addDpPa: Called for new configs
clrDpPa: Called for deleted configs
addHWObject: Call to add a new HWObject
clrHWObject: Call to remove an HWObject
Derive your own class to keep the lists in
sync
25
HWService
The main interface class for your hardware protocol implementation
initialize()
init hardware, ComDrv is initialized
start()
start communication, EV is connected
stop()
stop communication
workProc()
check for incoming data from hardware
(use DrvManager::toDP() for sending to WinCC OA)
writeData()
WinCC OA wants you to send data
singleQuery()
WinCC OA wants you to poll a value
generalQuery()
WinCC OA wants you to request all values
26
ComDrv Classes: HWObject
HWObject: Transport of data, contains:
Address name and Subindex
Data buffer with raw values
Number of elements in buffer
Transformation type, origin type, origin time, ...
Derive your own HWObject for additional infos
needed by the hardware protocol
Deduce the hardware address from the address name
27
HWObject entries
Can be created due to WinCC OA side configuration
For each new config in addDpPa create corresponding HWObject and
insert it into HWMapper
For each removed config in ClrDpPa remove corresponding HWObject
from HWMapper
Take care for multiple input parametrization!
Can be due to external parametrization or hardware information
During HWService::initialize() or HWService::start() get list of available
objects and create corresponding HWObjects in HWMapper
28
Data Flow in the ComDrv
Send value to peripheral device
Receive Hotlink and for each item do:
Lookup address config of DP or father
Lookup address config with subix 0
(HWMapper::getFirstIndex)
Set-up a HWObject
(HWMapper::findAddrObj)
Convert to raw data
(Transformation::toPeriph)
Send all values (HWService::writeData)
Signal all groups done (HWService::flush)
29
Data Flow in the ComDrv
Receive data from device
ComDrv calls HWService::workProc
You recv. data and set-up HWObject dataObj
with HW address, subix of first value, data and
number of elements
You lookup address object addrObj in HWMapper
(HWMapper::findHWObject)
You call DrvManager::toDp(dataObj, adrObj)
30
Data Flow in the ComDrv
Receive data (cont.)
Lookup address config with subix 0
(HWMapper::getFirstIndex)
Check LowLevelComparision
With LLC break data down to chunks, else
process entire buffer
(DrvManager::processData2Dp)
31
Data Flow in the ComDrv
Receive data (cont.)
Lookup all DpId and address config within
range [subix...+nofElements]
(HWMapper::getConfigPtr)
For each config, thats not an output do:
Convert data to WinCC OA (Transformation::toVar)
Convert and smooth
Collect all those data
Send data to Event
(DrvManager::sendData2Dp)
32
Data Flow in the ComDrv
Request data from device (SQ, Polling)
Lookup address config for DpId (SQ only)
Lookup address config with subix 0
(HWMapper::getFirstIndex)
Set-up HWObject with address and subix
(HWMapper::findHWAddr)
ComDrv calls HWService::singleQuery
You request Data and send them to
DrvManager::toDp
33
General Program Flow
mainLoop
Dispatch (GQ, SQ, send data to device)
Request polled data
Call HWService::workProc to poll device
Send data to Event
Cont. with dispatch
34
ComDrv Class Overview
Most of the work is done inside the ComDrv
classes
DrvManager communicates with Data, Event and
has the overall control
DrvDpCont manages the driver configs and is
responsible for data conversion and smoothing
HWMapper manages the lists to map the WinCC
OA address to a hardware address
35
ComDrv is an application!
ComDrv is a fully grown manager with its own config entries and
internal datapoint for runtime control
Config file entries are listed in the WinCC OA online reference
drvDpName defines the name of the ComDrv control DP
defaults to _Driver_num
...
Config file entries all have default values, so normally there is no
need to use the ComDrv config entries
36
ComDrv is an application!
ComDrv internal datapoint is used for runtime control
.GQ
.SQ
.PM
.DC
.AD.HWMask
.AD.DPMatch
.HW.HWMask
.HW.HWMatch
.IGQ
trigger general query
trigger single query
set poll mode (on/off)
disable commands (for redundancy)
search mask for periphaddress
all datapoints matching this mask
search mask for hwaddress
all hwaddresses which match
trigger general query on WinCC OA side
37
ComDrv Classes Overview cont.
Helper classes assist
HWMapDpPa contains the mapping DpId and
address config
PollList and PollItem manage the polling list
HWObject transport data, map address name to
hardware address and store last values for LLC
DrvAlive is a multipurpose timer class
38
ComDrv Helps You
PeriphAddr:
The address config
getName, getSubindex: Get name (_reference)
and subindex (_subindex)
getTransform, getTransformType: Get the
transformation object / type (_datatype)
setTransform, setTransformType: Set the
transformation object / type
isOutput, isSingle: Direction is to device, items
are transmitted individually (_mode)
39
ComDrv Needs Your Help
Transformation: Transform data between
WinCC OA variables and hardware format
toPeriph, toVar: Convert data WinCC OA <--> HW
isA: Define your own type
itemSize: HW size in byte of one value
getNumberOfElements: nofEl in one item
getVariableType: Optional, specify your favourite
WinCC OA variable type for toPeriph
40
ComDrv Needs Your Help
HWService: Interface for ComDrv
initialise, start, stop: Initialise interface, connect /
disconnect to device
workProc: poll peripheral devices
writeData: Send data to device
singleQuery: Request data from device
generalQuery: Request all data from device
41
ComDrv Needs Your Help
DrvRsrce: Manages config file and internal
datapoints
init, readSection: read config file
getNumberOfDpNames, getDpName4Query,
setDpIdentifier: Internal DP-name resolution
getNumberOfIdsToConnect, getId2Connect,
answer4DpId: Connect to internal DP
HWService::hotLink2Internal: Internal DP HL
42
Managing Internal DP
Define the DP name at the end of DrvRsrce::init
function
Get the DpId for internal DP
ComDrv calls DrvRsrce::getNumberOfDpNames
Return the number of Elements of your internal DP
For each DPE ComDrv calls getDpName4Query
Set-up an return the DPE name
For each response from Data Driver calls
DrvRsrce::setDpIdentifier
Driver calls DrvRsrce::allIdsGot, until you return TRUE
Then Driver connects to Event
43
ComDrv Needs Your Help
Connect
to internal DP
Driver calls DrvRsrce::getNumberOfIdsToConnect
For each DP Driver calls DrvRsrce::getId2Connect
For each answer Driver calls DrvRsrce::answer4DpId
At least delete the varPtr
Driver calls DrvRsrce::ready2Connect until you return
TRUE. Return TRUE if you got all current values you need
for initialisation, else FALSE
For each hotlink Driver calls DrvRsrce::isInternalDpID
Return INTERNAL_DPID, if its your internal DP, else
NOT_INTERNAL_DPID
44
ComDrv Needs Your Help
Notifications for internal DP
For each hotlink Driver calls DrvRsrce::isInternalDpID
Return INTERNAL_DPID, if its your internal DP, else
NOT_INTERNAL_DPID
Driver calls HWService::hotLink4InternalDp, if its your
internal DpId (above calls returned INTERNAL_DPID)
45
ComDrv needs your help
Since version 3.9 new DrvIntDp class
Easy support for internal datapoints
Most functionality implemented transparent to user
Specify number of DPEs
Overload callback functions
getName4DpId
answer4DpId
hotLink2Internal
46
(User)bits
Data quality bits
HWObject->setSBit(...)
DRV_USERBIT1 .... DRV_USERBIT32
DRV_INVALID
Userbit assignment
should be configurable via
config file entries!
HWObject->setTimeOfPeriphFlag()
Source of data
HWObject->setObjSrcType(...)
srcSpont
srcPolled
srcSingleQ
srcGeneralQ
47
Use of sub-indexes
Use sub-indexes if you cant distinguish items by
their HW address only
e.g. the 8 bits in a byte
If possible all items with identical address shall be
transmitted (Output Group)
Or they shall always be transmitted one at a time
(Output Single).
48
Use of sub-indexes: Altogether
In HWMapper::addDpPa
Check that there is only one HWObject for all
configs (N : 1)
(re) calculate the buffer length for all items and
set nofElement, Dlen in the HWObject
You may safely use LLC
Call DrvManager::toDp with this HWObject as
the second argument
49
Use of sub-indexes: Singles
In HWMapper::addDpPa
You may add one HWObject for each config (1:1) or
one for all configs (1:N)
(re) calculate the buffer length for all items and set
nofElement, Dlen in the HWObject
You may safely use LLC only if you have one
HWObject per config (data is stored there)
Call DrvManager::toDp with the correct
HWObject (Subindex) as second argument
50
Use of sub-indexes: Mixed
You dont want to go the easy way, or?
For Output: Check, if config is for Single or Group
and do as shown before
For Input: Behave as if all items will come together.
LLC will work after all items were transmitted together
the first time.
51
Redundancy
Redundancy is handled by the ComDrv
_DriverCommon.DC disables sending commands for
non-internal DPs
When receiving commands from your own internal DP
check the DC-state
(DrvResources::getDisableCommands()
Send input data from device to Event as if you were not
redundant
52
Redundancy
copyDp
Ctrl
EV
EV
Ctrl
fwdDp
Drv
Drv
53