Supported Data Flows
NMS to SCADA
Heartbeat
PingURL
The adapter periodically sends PingURL message to the each configured SCADA system. Failure to send the message or error response from SCADA system (reply contains errorObject element) triggers switch to alternate link (if available). Upon restoration of communication with the SCADA system (PingURL has been sent successfully) synchronization sequence is executed.
PingURL request example
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<ns4:MultiSpeakMsgHeader xmlns:ns4="http://www.multispeak.org/
Version_4.1_Release" xmlns:ns3="http://www.w3.org/1999/xlink"
xmlns:ns2="gml" xmlns="cpsm" />
</S:Header>
<S:Body>
<ns4:PingURL xmlns:ns4="http://www.multispeak.org/Version_4.1_Release"
xmlns:ns3="http://www.w3.org/1999/xlink" xmlns:ns2="gml" xmlns="cpsm" />
</S:Body>
</S:Envelope>
Synchronization/Integrity Check
The purpose of the synchronization sequence is to bring the state of devices in the NMS model up-to-date with the SCADA system. NMS supports two synchronization methods for device statuses, digital and analog measurements. At the beginning of the synchronization sequence, NMS will make GetMethods call to determine the list of operations supported by the SCADA system. Synchronization method selection is based on configured preferred method and available SCADA operations.
The synchronization sequence is executed automatically after the connection to a SCADA system is established. It also can be triggered manually using following command
Action -java multispeak.SCADA resync
GetMethods
GetMethods retrieves lists of operations the SCADA system implements. It is used to determine available modes of syn-chronization. It is also used to determine if control requests can be send to SCADA.
GetMethods Request and Response Example
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<ns4:MultiSpeakMsgHeader xmlns:ns4="http://www.multispeak.org/ Version_4.1_Release" xmlns:ns3="http://www.w3.org/1999/xlink" xmlns:ns2="gml" xmlns="cpsm" />
</S:Header>
<S:Body>
<ns4:GetMethods xmlns:ns4="http://www.multispeak.org/Version_4.1_Release"
xmlns:ns3="http://www.w3.org/1999/xlink" xmlns:ns2="gml" xmlns="cpsm" />
</S:Body>
</S:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ver="http://www.multispeak.org/Version_4.1_Release">
<soapenv:Header>
<ver:MultiSpeakMsgHeader/>
</soapenv:Header>
<soapenv:Body>
<ver:GetMethodsResponse>
<ver:GetMethodsResult>
<ver:string>PingURL</ver:string>
<ver:string>GetMethods</ver:string>
<ver:string>InitiateStatusReadByPointID</ver:string>
<ver:string>InitiateAnalogReadByPointID</ver:string>
<ver:string>InitiateControl</ver:string>
<ver:string>GetAllSCADAStatus</ver:string>
<ver:string>GetAllSCADAAnalogs</ver:string>
<ver:string>GetAllSCADATags</ver:string>
</ver:GetMethodsResult>
</ver:GetMethodsResponse>
</soapenv:Body>
</soapenv:Envelope>
GetAllSCADAStatus, GetAllSCADAAnalogs
The first synchronization method involves NMS invoking GetAllSCADAStatus and GetAllSCADAAnalogs operations to request the latest device statuses, digital and analog measurements from the SCADA. SCADA provides the requested information synchronously in the response message.
The MultiSpeak specification allows data to be returned in chunks by the SCADA system. In this case, NMS would have to make multiple GetAllSCADAXXX calls. The element lastReceived is included so that large sets of data can be returned in manageable blocks. lastReceived will carry an empty string the first time in a session that this method is invoked. When multiple calls to this method are required to obtain all of the data, the lastReceived should carry the objectID of the last data instance received in subsequent calls. If the ObjectsRemaining field is present in the MultiSpeak reply message’s message header, it will be used to determine when all of the data has been received. If the ObjectsRemaining field is not present, the empty result set will signal the end of the data.
GetAllSCADAStatus Request and Response Example
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<ns4:MultiSpeakMsgHeader xmlns:ns4="http://www.multispeak.org/ Version_4.1_Release"
xmlns:ns3="cpsm"
xmlns:ns2="http://www.w3.org/1999/xlink"
xmlns:ns1="gml"
Pwd="test" UserID="nms" />
</S:Header>
<S:Body>
<ns4:GetAllSCADAStatus xmlns:ns4="http://www.multispeak.org/ Version_4.1_Release"
xmlns:ns3="cpsm"
xmlns:ns2="http://www.w3.org/1999/xlink"
xmlns:ns1="gml">
<ns4:lastReceived></ns4:lastReceived>
</ns4:GetAllSCADAStatus>
</S:Body>
</S:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ver="http://www.multispeak.org/Version_4.1_Release"
xmlns:cpsm="cpsm">
<soapenv:Header>
<ver:MultiSpeakMsgHeader UserID="scada" Pwd="test"
ObjectsRemaining="0"/>
</soapenv:Header>
<soapenv:Body>
<ver:GetAllSCADAStatusResponse>
<ver:GetAllSCADAStatusResult>
<ver:scadaStatus>
<ver:objectName>BR_R-2241</ver:objectName>
<ver:quality>Initial</ver:quality>
<ver:status>Open</ver:status>
<ver:changeCounter>0</ver:changeCounter>
<ver:timeStamp>2011-03-01T11:11:11</ver:timeStamp>
</ver:scadaStatus>
</ver:GetAllSCADAStatusResult>
</ver:GetAllSCADAStatusResponse>
</soapenv:Body>
</soapenv:Envelope>
GetAllSCADAAnalogs Request and Response Example
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<ns4:MultiSpeakMsgHeader xmlns:ns4="http://www.multispeak.org/ Version_4.1_Release"
xmlns:ns3="cpsm"
xmlns:ns2="http://www.w3.org/1999/xlink"
xmlns:ns1="gml"
Pwd="test" UserID="nms" />
</S:Header>
<S:Body>
<ns4:GetAllSCADAAnalogs xmlns:ns4="http://www.multispeak.org/ Version_4.1_Release"
xmlns:ns3="cpsm"
xmlns:ns2="http://www.w3.org/1999/xlink"
xmlns:ns1="gml">
<ns4:lastReceived></ns4:lastReceived>
</ns4:GetAllSCADAAnalogs>
</S:Body>
</S:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ver="http://www.multispeak.org/Version_4.1_Release"
xmlns:cpsm="cpsm">
<soapenv:Header>
<ver:MultiSpeakMsgHeader UserID="scada" Pwd="test"
ObjectsRemaining="0" />
</soapenv:Header>
<soapenv:Body>
<ver:GetAllSCADAAnalogsResponse>
<ver:GetAllSCADAAnalogsResult>
<ver:scadaAnalog>
<ver:objectName>BR_R-2241</ver:objectName>
<ver:value units="Amps">260.78</ver:value>
<ver:quality>Measured</ver:quality>
<ver:timeStamp>2010-06-27T14:41:15-05:00</ver:timeStamp>
<ver:measurementTypeID>Amps</ver:measurementTypeID>
</ver:scadaAnalog>
<ver:scadaAnalog>
<ver:objectName>BR_R-2241</ver:objectName>
<ver:value>0</ver:value>
<ver:quality>Default</ver:quality>
<ver:timeStamp>2010-06-27T14:41:15-05:00</ver:timeStamp>
<ver:measurementTypeID>faultIndicator</ver:measurementTypeID>
</ver:scadaAnalog>
</ver:GetAllSCADAAnalogsResult>
</ver:GetAllSCADAAnalogsResponse>
</soapenv:Body>
</soapenv:Envelope>
GetAllSCADAAnalogs is used for both digital and analog measurements.
InitiateStatusReadByPointID, InitiateAnalogReadByPointID, InitiateTagReadyByPointID
The second synchronization method uses InitiateXXXReadByPointID operations to request latest device statuses, tags, digital and analog measurements from the SCADA. SCADA provides requested information asynchronously by sending XXXChangedNotificationByPointID messages to NMS. To avoid having to send all SCADA points known to NMS an empty list of SCADA points can be used to indicate desire to initiate read for all SCADA points. Operation InitiateTagReadByPointID is not part of MultiSpeak 4.1 specification.
InitiateStatusReadByPointID and InitiateAnalogReadByPointID request examples
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<ns4:MultiSpeakMsgHeader xmlns:ns4="http://www.multispeak.org/Version_4.1_Release"
xmlns:ns3="cpsm"
xmlns:ns2="http://www.w3.org/1999/xlink"
xmlns:ns1="gml"
Pwd="test" UserID="nms" />
</S:Header>
<S:Body>
<ns4:InitiateStatusReadByPointID
xmlns:ns4="http://www.multispeak.org/Version_4.1_Release"
xmlns:ns3="cpsm" xmlns:ns2="http://www.w3.org/1999/xlink"
xmlns:ns1="gml">
<ns4:pointIDs />
<ns4:responseURL>https://nms-server:7002/nms-amr/oa</ns4:responseURL>
<ns4:transactionID>1300163600187</ns4:transactionID>
<ns4:expTime units="Hours">1.0</ns4:expTime>
</ns4:InitiateStatusReadByPointID>
</S:Body>
</S:Envelope>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<ns4:MultiSpeakMsgHeader xmlns:ns4="http://www.multispeak.org/Version_4.1_Release"
xmlns:ns3="cpsm" xmlns:ns2="http://www.w3.org/1999/xlink"
xmlns:ns1="gml"
Pwd="test" UserID="nms" />
</S:Header>
<S:Body>
<ns4:InitiateAnalogReadByPointID
xmlns:ns4="http://www.multispeak.org/Version_4.1_Release" xmlns:ns3="cpsm"
xmlns:ns2="http://www.w3.org/1999/xlink" xmlns:ns1="gml">
<ns4:pointIDs />
<ns4:responseURL>https://nms-server:7002/nms-amr/oa</ns4:responseURL>
<ns4:transactionID>1300163600203</ns4:transactionID>
<ns4:expTime units="Hours">1.0</ns4:expTime>
</ns4:InitiateAnalogReadByPointID>
</S:Body>
</S:Envelope>
GetAllSCADATags
Synchronization of tag information is done using GetAllSCADATags operation (not part of MultiSpeak 4.1). The expectation is that SCADA systems would return information about all currently applied tags. NMS compares information received from SCADA against tags currently present in the model and make necessary adjustments (adding or removing tags).
GetAllSCADATags request and response example
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<ns4:MultiSpeakMsgHeader xmlns:ns4="http://www.multispeak.org/Version_4.1_Release"
xmlns:ns3="cpsm"
xmlns:ns2="http://www.w3.org/1999/xlink"
xmlns:ns1="gml"
Pwd="test" UserID="nms" />
</S:Header>
<S:Body>
<ns4:GetAllSCADATags xmlns:ns4="http://www.multispeak.org/Version_4.1_Release"
xmlns:ns3="cpsm"
xmlns:ns2="http://www.w3.org/1999/xlink"
xmlns:ns1="gml">
<ns4:lastReceived></ns4:lastReceived>
</ns4:GetAllSCADATags>
</S:Body>
</S:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ver="http://www.multispeak.org/Version_4.1_Release"
xmlns:cpsm="cpsm">
<soapenv:Header>
<ver:MultiSpeakMsgHeader UserID="scada" Pwd="test"
ObjectsRemaining="0"/>
</soapenv:Header>
<soapenv:Body>
<ver:GetAllSCADATagsResponse>
<ver:GetAllSCADATagsResult>
<ver:scadaTag objectID="scada-tag-1" verb="Change">
<ver:tagType>Hold</ver:tagType>
<ver:scadaPointID>BR2422</ver:scadaPointID>
<ver:username>scada</ver:username>
<ver:comment>test tag</ver:comment>
<ver:timeStamp>2011-07-19T14:12:31.859-05:00</ver:timeStamp>
</ver:scadaTag>
</ver:GetAllSCADATagsResult>
</ver:GetAllSCADATagsResponse>
</soapenv:Body>
</soapenv:Envelope>
Controls
NMS can use the same operation ( InitiateControl) to request device operation and to request placement or removal of a tag. The InitiateControl message consists of a single controlAction object.
The following InitiateControl fields are used:
Notes:
InitiateControl request example
<soapenv:Envelope xmlns:soapenv=http://schemas.xmlsoap.org/soap/envelope/
xmlns:ver="http://www.multispeak.org/Version_4.1_Release">
<soapenv:Header>
<ver:MultiSpeakMsgHeader UserID="nms" Pwd="test" TimeStamp="2011-03-19T20:04:37"/>
</soapenv:Header>
<soapenv:Body>
<ver:InitiateControl>
<ver:controlAction>
<ver:scadaPointID>BR_R-2241</ver:scadaPointID>
<ver:controlKey>open</ver:controlKey>
<ver:function>Direct operate</ver:function>
<ver:relayType>Normal</ver:relayType>
</ver:controlAction>
<ver:responseURL>https://nms-server:7002/nms-amr/oa</ver:responseURL>
<ver:transactionID>12345</ver:transactionID>
</ver:InitiateControl>
</soapenv:Body>
</soapenv:Envelope>
Operating a SCADA-controlled device
Note: When SCADA sends ControlActionCompleted message to NMS in case of success NMS will not update device status in its model until SCADAStatusChangedNotification message has been received.
Placing or Removing a Tag on a SCADA-Controlled Device
Note: SCADA can send ControlActionCompleted message to NMS in case of success, but NMS will not update tag information in its model until SCADATagChangedNotification message has been received.
Outgoing Device Statuses
If SCADA system has knowledge of the NMS electrical model, then the adapter can be configured to send device status information for non-SCADA devices in the NMS model to the SCADA system.
The SCADA system plugin method buildScadaPointId is used to construct SCADA point id for non-SCADA devices.
SCADAStatusChangedNotification
Sends NMS device status changes to SCADA system.
StatusChangedNotificationByPointID
Sends NMS device status information to SCADA system in response to InitiateStatusReadByPointID request. NMS only returns information for devices which are not in the nominal state to reduce volume of data.
Display Integration
HighlightObjectInDisplay
This message causes SCADA system to focus display on a particular SCADA point.