diff --git a/clients/opal/.project b/clients/opal/.project
new file mode 100644
index 000000000..ee036a7d6
--- /dev/null
+++ b/clients/opal/.project
@@ -0,0 +1,12 @@
+
+
+ s2ss_tests
+
+
+
+
+
+
+ com.opalrt.rtlab.ui.rtlabnature
+
+
diff --git a/clients/opal/.settings/com.opalrt.rtlab.ui.application.prefs b/clients/opal/.settings/com.opalrt.rtlab.ui.application.prefs
new file mode 100644
index 000000000..b62a22d66
--- /dev/null
+++ b/clients/opal/.settings/com.opalrt.rtlab.ui.application.prefs
@@ -0,0 +1,3 @@
+#Mon Jul 14 20:43:18 CEST 2014
+eclipse.preferences.version=1
+rtprojectfile=s2ss_tests.llp
diff --git a/clients/opal/help/help.html b/clients/opal/help/help.html
new file mode 100644
index 000000000..3e45c792a
--- /dev/null
+++ b/clients/opal/help/help.html
@@ -0,0 +1,12 @@
+
+
+
Demo Help: empty project
+Empty project
+
+Create a new empty project
+
+
+Use this template to generate an empty project. This is the default template used when you do not choose any template.
+
+
+
\ No newline at end of file
diff --git a/clients/opal/models/send_receive/AsyncIP.mk b/clients/opal/models/send_receive/AsyncIP.mk
new file mode 100644
index 000000000..5af739955
--- /dev/null
+++ b/clients/opal/models/send_receive/AsyncIP.mk
@@ -0,0 +1,75 @@
+# Specify program name
+PROGRAM = AsyncIP
+
+# Specify default values if we are not compiling from RT-LAB
+TARGET_OPALRT_ROOT = /usr/opalrt
+
+# QNX v6.x
+ifeq "$(SYSNAME)" "nto"
+ CC = gcc
+ LD = $(CC)
+ TARGET_LIB = -lsocket
+endif
+
+# RedHawk Linux
+ifeq "$(shell uname)" "Linux"
+ RTLAB_INTEL_COMPILER ?= 1
+
+ # Intel Compiler support
+ ifeq ($(RTLAB_INTEL_COMPILER),1)
+ CC = opicc
+ LD = opicpc
+ # Gnu Compiler support
+ else
+ CC = gcc
+ LD = g++
+ INTEL_LIBS = -limf -lirc
+ endif
+
+ # RedHat or RedHawk
+ LINUX_FLAVOR = $(shell uname -r | grep RedHawk)
+ ifneq "$(LINUX_FLAVOR) " " " ### Linux (RedHat)
+ RH_FLAGS = -D_GNU_SOURCE -D__redhawk__
+ RH_LIBS = -lccur_rt
+ else
+ RH_FLAGS = -D_GNU_SOURCE
+ endif
+
+ TARGET_LIB = -lpthread -lm -ldl -lutil -lrt $(RH_LIBS) $(INTEL_LIBS)
+endif
+
+# Support for debugging symbols
+ifeq ($(DEBUG),1)
+ CC_DEBUG_OPTS=-g -D_DEBUG
+ LD_DEBUG_OPTS=-g
+else
+ CC_DEBUG_OPTS=-O
+ LD_DEBUG_OPTS=
+endif
+
+INCLUDES = -I.
+LIBPATH = -L.
+CC_OPTS =
+LD_OPTS =
+OBJS = ${PROGRAM}.o Sched.o Interface.o Socket.o
+
+ADDLIB = -lOpalCore -lOpalUtils
+LIBS = -lOpalAsyncApiCore $(ADDLIB) $(TARGET_LIB)
+
+CFLAGS = -c $(CC_OPTS) $(CC_DEBUG_OPTS) $(RH_FLAGS) $(INCLUDES)
+LDFLAGS = $(LD_OPTS) $(LD_DEBUG_OPTS) $(LIBPATH)
+
+all: $(PROGRAM)
+
+install:
+ \mkdir -p $(TARGET_OPALRT_ROOT)/local
+ \chmod 755 $(TARGET_OPALRT_ROOT)/local
+ \cp -f $(PROGRAM) $(TARGET_OPALRT_ROOT)/local
+
+clean:
+ \rm -f $(OBJS) $(PROGRAM)
+
+$(PROGRAM): $(OBJS)
+ $(LD) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
+ chmod 777 $@
+ @echo "### Created executable: $(PROGRAM)"
diff --git a/clients/opal/models/send_receive/include/Config.h b/clients/opal/models/send_receive/include/Config.h
new file mode 100644
index 000000000..dc5d2af80
--- /dev/null
+++ b/clients/opal/models/send_receive/include/Config.h
@@ -0,0 +1,14 @@
+/** Compiled-in settings
+ *
+ * @author Steffen Vogel
+ * @copyright 2014, Institute for Automation of Complex Power Systems, EONERC
+ * @file
+ */
+
+#ifndef _CONFIG_H_
+#define _CONFIG_H_
+
+#define PROGNAME "AsyncIP"
+#define VERSION "0.1"
+
+#endif /* _CONFIG_H_ */
\ No newline at end of file
diff --git a/clients/opal/models/send_receive/include/Interface.h b/clients/opal/models/send_receive/include/Interface.h
new file mode 100644
index 000000000..6ed00a284
--- /dev/null
+++ b/clients/opal/models/send_receive/include/Interface.h
@@ -0,0 +1,13 @@
+/** OPAL Interface setup
+ *
+ * @author Steffen Vogel
+ * @copyright 2014, Institute for Automation of Complex Power Systems, EONERC
+ * @file
+ */
+
+#ifndef _INTERFACE_H_
+#define _INTERFACE_H_
+
+int if_setup(const char *op, const char *iface, const char *addr);
+
+#endif /* _INTERFACE_H_ */
diff --git a/clients/opal/models/send_receive/include/MsgFormat.h b/clients/opal/models/send_receive/include/MsgFormat.h
new file mode 100644
index 000000000..4e081eb05
--- /dev/null
+++ b/clients/opal/models/send_receive/include/MsgFormat.h
@@ -0,0 +1,51 @@
+/** Message format
+ *
+ * @author Steffen Vogel
+ * @copyright 2014, Institute for Automation of Complex Power Systems, EONERC
+ * @file
+ */
+
+#ifndef _MSG_FORMAT_H_
+#define _MSG_FORMAT_H_
+
+#include
+
+/** Maximum number of dword values in a message */
+#define MSG_VALUES 16
+/** The current version number for the message format */
+#define MSG_VERSION 0
+
+/** @todo Implement more message types */
+#define MSG_TYPE_DATA 0
+#define MSG_TYPE_START 1
+#define MSG_TYPE_STOP 2
+
+/** Initialize a message */
+#define MSG_INIT(i) { \
+ .version = MSG_VERSION, \
+ .type = MSG_TYPE_DATA, \
+ .length = i, \
+ .sequence = 0 \
+}
+
+/** This message format is used by all clients
+ *
+ * @diafile msg_format.dia
+ **/
+struct msg
+{
+ /** The version specifies the format of the remaining message */
+ unsigned version : 4;
+ /** Data or control message */
+ unsigned type : 2;
+ /** These bits are reserved for future extensions */
+ unsigned __padding : 2;
+ /** Number of valid dword values in msg::data[] */
+ uint8_t length;
+ /** The sequence number gets incremented by one for consecutive messages */
+ uint16_t sequence;
+ /** The message payload */
+ float data[MSG_VALUES];
+} __attribute__((packed));
+
+#endif /* _MSG_FORMAT_H_ */
diff --git a/clients/opal/models/send_receive/include/Sched.h b/clients/opal/models/send_receive/include/Sched.h
new file mode 100644
index 000000000..a089febea
--- /dev/null
+++ b/clients/opal/models/send_receive/include/Sched.h
@@ -0,0 +1,17 @@
+/** Configure Scheduler
+ *
+ * @author Steffen Vogel
+ * @author Mathieu Dubé-Dallaire
+ * @copyright 2014, Institute for Automation of Complex Power Systems, EONERC
+ * @copyright 2003, OPAL-RT Technologies inc
+ * @file
+ */
+
+#ifndef _SCHED_H_
+#define _SCHED_H_
+
+#define EOK 0
+
+int AssignProcToCpu0(void);
+
+#endif /* _SCHED_H_ */
diff --git a/clients/opal/models/send_receive/include/Socket.h b/clients/opal/models/send_receive/include/Socket.h
new file mode 100644
index 000000000..e45256821
--- /dev/null
+++ b/clients/opal/models/send_receive/include/Socket.h
@@ -0,0 +1,33 @@
+/** Helper functions for socket
+ *
+ * Code example of an asynchronous program. This program is started
+ * by the asynchronous controller and demonstrates how to send and
+ * receive data to and from the asynchronous icons and a UDP or TCP
+ * port.
+ *
+ * @author Steffen Vogel
+ * @author Mathieu Dubé-Dallaire
+ * @copyright 2014, Institute for Automation of Complex Power Systems, EONERC
+ * @copyright 2003, OPAL-RT Technologies inc
+ * @file
+ */
+
+#ifndef _SOCKET_H_
+#define _SOCKET_H_
+
+#define RT
+#include "OpalGenAsyncParamCtrl.h"
+
+#define UDP_PROTOCOL 1
+#define TCP_PROTOCOL 2
+#define EOK 0
+
+int InitSocket(Opal_GenAsyncParam_Ctrl IconCtrlStruct);
+
+int SendPacket(char* DataSend, int datalength);
+
+int RecvPacket(char* DataRecv, int datalength, double timeout);
+
+int CloseSocket(Opal_GenAsyncParam_Ctrl IconCtrlStruct);
+
+#endif /* _SOCKET_H_ */
diff --git a/clients/opal/models/send_receive/send_receive.llm b/clients/opal/models/send_receive/send_receive.llm
new file mode 100644
index 000000000..a4c7a4035
--- /dev/null
+++ b/clients/opal/models/send_receive/send_receive.llm
@@ -0,0 +1,107 @@
+[EnvVars]
+ABORT_COMPILE_WHEN_NO_BITSTREAM=0
+ACTION_AFTER_N_OVERRUNS=10
+ACTION_ON_OVERRUNS=0
+AcquisitionMemory=0,2500,24,100
+ActiveGroups=7/0/24/25/26/27/28/29/
+CACHEABLE_DMA_MEMORY_ACCESS=ON
+COMM_RT=UDP/IP
+ClockPeriodMode=Free-Clock
+ClockPeriodTime=10
+DEBUG=0
+DETECT_OVERRUNS=ON
+ENABLE_WATCHDOG=ON
+EXT_CC_OPTS=
+EXT_LD_OPTS=
+EXT_LIB=
+EXT_LIBPATH=
+MODEL_PAUSE_TIME=0.000000
+MODEL_STOP_TIME=0.000000
+MONITORING=ON
+MONITORING_BLOCK=OFF
+MONITORING_DISPLAY=NEVER
+MSG_PRECISION_FACTOR=0
+MaxDynamicSignals=2/0/100/24/100/
+NB_STEP_WITHOUT_OVERRUNS=10
+OPAL_DEBUG=OFF
+OP_MATLABR2011B=1
+OS_COMPILE_RELEASE=2.6.29.6-opalrt-5
+PRINT_LOG_LEVEL=ALWAYS
+RESET_IO_MISSING=ON
+SYSNAME=linux
+USER_INCS=
+USER_SRCS=
+WATCHDOG_TIMEOUT=5000
+[EnvVars_REDHAWK_DYN_1]
+INTERNAL_IGN_SOURCE_FILE=sfun_gen_async_ctrl.c sfun_recv_async.c sfun_send_async.c
+INTERNAL_LIBRARY2=-lOpalAsyncApiR2011b
+INTERNAL_LIBRARY3=-lOpalAsyncApiCore
+[ExtraPutFilesComp]
+AsyncIP.mk=Ascii
+include\Config.h=Ascii
+include\Interface.h=Ascii
+include\MsgFormat.h=Ascii
+include\Sched.h=Ascii
+include\Socket.h=Ascii
+src\AsyncIP.c=Ascii
+src\Interface.c=Ascii
+src\Sched.c=Ascii
+src\Socket.c=Ascii
+[ExtraPutFilesComp_1_RT_LAB]
+C:\OPAL-RT\RT-LAB\v10.5.9.356\common\lib\redhawk\libOpalAsyncApiCore.a=Binary
+[General]
+ATT_CHECKSUM1=3292912416
+ATT_CHECKSUM2=2957866115
+ATT_CHECKSUM3=2922744635
+ATT_CHECKSUM4=170288900
+ATT_CREATED_BY=jwu
+ATT_CREATED_ON=Thu Apr 15 08:21:54 1999
+ATT_ENABLE_PTA=OFF
+ATT_HANDLE_CONSOLE=ON
+ATT_LAST_SAVED_BY=ACS
+ATT_LAST_SAVED_ON=Mon Jul 14 21:00:08 2014
+ATT_REVISION=1.435
+AutoRetrieveFiles=ON
+AutoRetrieveRtlab=ON
+CompilerVersion=AUTOMATIC
+DESCRIPTION=
+DinamoFlag=OFF
+FILENAME=D:\msv\svo\opal\s2ss_tests\models\send_receive\send_receive.mdl
+FORCE_RECOMPILE=0
+IMPORTED_GLOBAL_VARIABLES=1
+LastCompileRtlabVersion=v10.5.9.356
+LastMatlabUsed=21
+LastMatlabUsedName=v7.13
+MATLAB_USED_IN_MODEL=21
+Name=send_receive
+PRINT_CYCLE=OFF
+PostBuildCmd=
+PreBuildCmd=
+QNX_LAST_COMPILE_VERSION=
+RH64_LAST_COMPILE_VERSION=
+RH_LAST_COMPILE_VERSION=2.6.29.6-opalrt-5
+ReportFileId=
+RetrieveBuildTree=ON
+RetrieveRootDir=
+SimulationMode=2
+TLC=Automatic
+TMF=Automatic
+TRANSFERFILE_AT_LOAD=OFF
+TargetCompileCmd=/usr/bin/make -f /usr/opalrt/common/bin/opalmodelmk
+TargetPlatform=REDHAWK
+TimeFactor=1.000000000000000
+TimeStep=0.000050000000000
+sc_consoleTimeStep=-1.000000000000000
+sm_modelTimeStep=0.000049999998737
+sm_send_receiveTimeStep=0.000049999998737
+[NodeMapping]
+sm_model=ACS_OPAL_RT
+sm_model_CORE_ASSIGNATION=1
+sm_model_CPU=-1
+sm_model_DEBUG=OFF
+sm_model_XHP_ENABLE=FALSE
+sm_send_receive=ACS_OPAL_RT
+sm_send_receive_CORE_ASSIGNATION=1
+sm_send_receive_CPU=-1
+sm_send_receive_DEBUG=OFF
+sm_send_receive_XHP_ENABLE=FALSE
diff --git a/clients/opal/models/send_receive/send_receive.mdl b/clients/opal/models/send_receive/send_receive.mdl
new file mode 100644
index 000000000..7451d0b8c
--- /dev/null
+++ b/clients/opal/models/send_receive/send_receive.mdl
@@ -0,0 +1,1472 @@
+# $Revision: 1.1 $
+Model {
+ Name "send_receive"
+ Version 7.8
+ MdlSubVersion 0
+ GraphicalInterface {
+ NumRootInports 0
+ NumRootOutports 0
+ ParameterArgumentNames ""
+ ComputedModelVersion "1.435"
+ NumModelReferences 0
+ NumTestPointedSignals 0
+ }
+ SavedCharacterEncoding "windows-1252"
+ SaveDefaultBlockParams on
+ ScopeRefreshTime 0.035000
+ OverrideScopeRefreshTime on
+ DisableAllScopes off
+ DataTypeOverride "UseLocalSettings"
+ DataTypeOverrideAppliesTo "AllNumericTypes"
+ MinMaxOverflowLogging "UseLocalSettings"
+ MinMaxOverflowArchiveMode "Overwrite"
+ FPTRunName "Run 1"
+ MaxMDLFileLineLength 120
+ Created "Thu Apr 15 08:21:54 1999"
+ Creator "jwu"
+ UpdateHistory "UpdateHistoryNever"
+ ModifiedByFormat "%"
+ LastModifiedBy "ACS"
+ ModifiedDateFormat "%"
+ LastModifiedDate "Mon Jul 14 21:00:08 2014"
+ RTWModifiedTimeStamp 327272401
+ ModelVersionFormat "1.%"
+ ConfigurationManager "none"
+ SampleTimeColors off
+ SampleTimeAnnotations off
+ LibraryLinkDisplay "none"
+ WideLines off
+ ShowLineDimensions on
+ ShowPortDataTypes off
+ ShowDesignRanges off
+ ShowLoopsOnError on
+ IgnoreBidirectionalLines off
+ ShowStorageClass off
+ ShowTestPointIcons on
+ ShowSignalResolutionIcons on
+ ShowViewerIcons on
+ SortedOrder off
+ ExecutionContextIcon off
+ ShowLinearizationAnnotations on
+ BlockNameDataTip off
+ BlockParametersDataTip on
+ BlockDescriptionStringDataTip off
+ ToolBar on
+ StatusBar on
+ BrowserShowLibraryLinks off
+ BrowserLookUnderMasks off
+ SimulationMode "normal"
+ LinearizationMsg "none"
+ Profile off
+ ParamWorkspaceSource "MATLABWorkspace"
+ AccelSystemTargetFile "accel.tlc"
+ AccelTemplateMakefile "accel_default_tmf"
+ AccelMakeCommand "make_rtw"
+ TryForcingSFcnDF off
+ RecordCoverage off
+ CovPath "/"
+ CovSaveName "covdata"
+ CovMetricSettings "dw"
+ CovNameIncrementing off
+ CovHtmlReporting on
+ CovForceBlockReductionOff on
+ covSaveCumulativeToWorkspaceVar on
+ CovSaveSingleToWorkspaceVar on
+ CovCumulativeVarName "covCumulativeData"
+ CovCumulativeReport off
+ CovReportOnPause on
+ CovModelRefEnable "Off"
+ CovExternalEMLEnable off
+ ExtModeBatchMode off
+ ExtModeEnableFloating on
+ ExtModeTrigType "manual"
+ ExtModeTrigMode "oneshot"
+ ExtModeTrigPort "1"
+ ExtModeTrigElement "any"
+ ExtModeTrigDuration 1000
+ ExtModeTrigDurationFloating "auto"
+ ExtModeTrigHoldOff 0
+ ExtModeTrigDelay 0
+ ExtModeTrigDirection "rising"
+ ExtModeTrigLevel 0
+ ExtModeArchiveMode "off"
+ ExtModeAutoIncOneShot off
+ ExtModeIncDirWhenArm off
+ ExtModeAddSuffixToVar off
+ ExtModeWriteAllDataToWs off
+ ExtModeArmWhenConnect off
+ ExtModeSkipDownloadWhenConnect off
+ ExtModeLogAll on
+ ExtModeAutoUpdateStatusClock on
+ BufferReuse off
+ ShowModelReferenceBlockVersion off
+ ShowModelReferenceBlockIO off
+ Array {
+ Type "Handle"
+ Dimension 1
+ Simulink.ConfigSet {
+ $ObjectID 1
+ Version "1.11.1"
+ Array {
+ Type "Handle"
+ Dimension 8
+ Simulink.SolverCC {
+ $ObjectID 2
+ Version "1.11.1"
+ StartTime "0.0"
+ StopTime "inf"
+ AbsTol "1e-6"
+ FixedStep "0.00005"
+ InitialStep "auto"
+ MaxNumMinSteps "-1"
+ MaxOrder 5
+ ZcThreshold "auto"
+ ConsecutiveZCsStepRelTol "10*128*eps"
+ MaxConsecutiveZCs "1000"
+ ExtrapolationOrder 4
+ NumberNewtonIterations 1
+ MaxStep "0.01"
+ MinStep "auto"
+ MaxConsecutiveMinStep "1"
+ RelTol "1e-3"
+ SolverMode "SingleTasking"
+ ConcurrentTasks off
+ Solver "ode4"
+ SolverName "ode4"
+ SolverJacobianMethodControl "auto"
+ ShapePreserveControl "DisableAll"
+ ZeroCrossControl "UseLocalSettings"
+ ZeroCrossAlgorithm "Nonadaptive"
+ AlgebraicLoopSolver "TrustRegion"
+ SolverResetMethod "Fast"
+ PositivePriorityOrder off
+ AutoInsertRateTranBlk off
+ SampleTimeConstraint "Unconstrained"
+ InsertRTBMode "Whenever possible"
+ }
+ Simulink.DataIOCC {
+ $ObjectID 3
+ Version "1.11.1"
+ Decimation "1"
+ ExternalInput "[]"
+ FinalStateName "xFinal"
+ InitialState "[]"
+ LimitDataPoints off
+ MaxDataPoints "1000"
+ LoadExternalInput off
+ LoadInitialState off
+ SaveFinalState off
+ SaveCompleteFinalSimState off
+ SaveFormat "Array"
+ SignalLoggingSaveFormat "ModelDataLogs"
+ SaveOutput off
+ SaveState off
+ SignalLogging on
+ DSMLogging on
+ InspectSignalLogs off
+ SaveTime off
+ ReturnWorkspaceOutputs off
+ StateSaveName "xout"
+ TimeSaveName "tout"
+ OutputSaveName "yout"
+ SignalLoggingName "sigsOut"
+ DSMLoggingName "dsmout"
+ OutputOption "RefineOutputTimes"
+ OutputTimes "[]"
+ ReturnWorkspaceOutputsName "out"
+ Refine "1"
+ }
+ Simulink.OptimizationCC {
+ $ObjectID 4
+ Version "1.11.1"
+ Array {
+ Type "Cell"
+ Dimension 4
+ Cell "ZeroExternalMemoryAtStartup"
+ Cell "ZeroInternalMemoryAtStartup"
+ Cell "NoFixptDivByZeroProtection"
+ Cell "OptimizeModelRefInitCode"
+ PropName "DisabledProps"
+ }
+ BlockReduction on
+ BooleanDataType off
+ ConditionallyExecuteInputs on
+ InlineParams off
+ UseIntDivNetSlope off
+ UseFloatMulNetSlope off
+ UseSpecifiedMinMax off
+ InlineInvariantSignals off
+ OptimizeBlockIOStorage off
+ BufferReuse off
+ EnhancedBackFolding off
+ StrengthReduction off
+ ExpressionFolding off
+ BooleansAsBitfields off
+ BitfieldContainerType "uint_T"
+ EnableMemcpy on
+ MemcpyThreshold 64
+ PassReuseOutputArgsAs "Structure reference"
+ ExpressionDepthLimit 2147483647
+ FoldNonRolledExpr off
+ LocalBlockOutputs off
+ RollThreshold 5
+ SystemCodeInlineAuto off
+ StateBitsets off
+ DataBitsets off
+ UseTempVars off
+ ZeroExternalMemoryAtStartup on
+ ZeroInternalMemoryAtStartup on
+ InitFltsAndDblsToZero on
+ NoFixptDivByZeroProtection off
+ EfficientFloat2IntCast off
+ EfficientMapNaN2IntZero on
+ OptimizeModelRefInitCode off
+ LifeSpan "inf"
+ MaxStackSize "Inherit from target"
+ BufferReusableBoundary on
+ SimCompilerOptimization "Off"
+ AccelVerboseBuild off
+ AccelParallelForEachSubsystem on
+ }
+ Simulink.DebuggingCC {
+ $ObjectID 5
+ Version "1.11.1"
+ RTPrefix "error"
+ ConsistencyChecking "none"
+ ArrayBoundsChecking "none"
+ SignalInfNanChecking "none"
+ SignalRangeChecking "none"
+ ReadBeforeWriteMsg "UseLocalSettings"
+ WriteAfterWriteMsg "UseLocalSettings"
+ WriteAfterReadMsg "UseLocalSettings"
+ AlgebraicLoopMsg "warning"
+ ArtificialAlgebraicLoopMsg "warning"
+ SaveWithDisabledLinksMsg "warning"
+ SaveWithParameterizedLinksMsg "none"
+ CheckSSInitialOutputMsg on
+ UnderspecifiedInitializationDetection "Classic"
+ MergeDetectMultiDrivingBlocksExec "none"
+ CheckExecutionContextPreStartOutputMsg off
+ CheckExecutionContextRuntimeOutputMsg off
+ SignalResolutionControl "TryResolveAllWithWarning"
+ BlockPriorityViolationMsg "warning"
+ MinStepSizeMsg "warning"
+ TimeAdjustmentMsg "none"
+ MaxConsecutiveZCsMsg "error"
+ MaskedZcDiagnostic "warning"
+ IgnoredZcDiagnostic "warning"
+ SolverPrmCheckMsg "none"
+ InheritedTsInSrcMsg "none"
+ DiscreteInheritContinuousMsg "warning"
+ MultiTaskDSMMsg "warning"
+ MultiTaskCondExecSysMsg "none"
+ MultiTaskRateTransMsg "error"
+ SingleTaskRateTransMsg "none"
+ TasksWithSamePriorityMsg "warning"
+ SigSpecEnsureSampleTimeMsg "warning"
+ CheckMatrixSingularityMsg "none"
+ IntegerOverflowMsg "warning"
+ Int32ToFloatConvMsg "warning"
+ ParameterDowncastMsg "error"
+ ParameterOverflowMsg "error"
+ ParameterUnderflowMsg "none"
+ ParameterPrecisionLossMsg "warning"
+ ParameterTunabilityLossMsg "warning"
+ FixptConstUnderflowMsg "none"
+ FixptConstOverflowMsg "none"
+ FixptConstPrecisionLossMsg "none"
+ UnderSpecifiedDataTypeMsg "none"
+ UnnecessaryDatatypeConvMsg "none"
+ VectorMatrixConversionMsg "none"
+ InvalidFcnCallConnMsg "error"
+ FcnCallInpInsideContextMsg "Use local settings"
+ SignalLabelMismatchMsg "none"
+ UnconnectedInputMsg "warning"
+ UnconnectedOutputMsg "warning"
+ UnconnectedLineMsg "warning"
+ SFcnCompatibilityMsg "none"
+ FrameProcessingCompatibilityMsg "warning"
+ UniqueDataStoreMsg "none"
+ BusObjectLabelMismatch "warning"
+ RootOutportRequireBusObject "warning"
+ AssertControl "UseLocalSettings"
+ EnableOverflowDetection off
+ ModelReferenceIOMsg "none"
+ ModelReferenceMultiInstanceNormalModeStructChecksumCheck "error"
+ ModelReferenceVersionMismatchMessage "none"
+ ModelReferenceIOMismatchMessage "none"
+ ModelReferenceCSMismatchMessage "none"
+ UnknownTsInhSupMsg "warning"
+ ModelReferenceDataLoggingMessage "warning"
+ ModelReferenceSymbolNameMessage "warning"
+ ModelReferenceExtraNoncontSigs "error"
+ StateNameClashWarn "warning"
+ SimStateInterfaceChecksumMismatchMsg "warning"
+ SimStateOlderReleaseMsg "error"
+ InitInArrayFormatMsg "warning"
+ StrictBusMsg "None"
+ BusNameAdapt "WarnAndRepair"
+ NonBusSignalsTreatedAsBus "none"
+ LoggingUnavailableSignals "error"
+ BlockIODiagnostic "none"
+ SFUnusedDataAndEventsDiag "warning"
+ SFUnexpectedBacktrackingDiag "warning"
+ SFInvalidInputDataAccessInChartInitDiag "warning"
+ SFNoUnconditionalDefaultTransitionDiag "warning"
+ SFTransitionOutsideNaturalParentDiag "warning"
+ SFUnconditionalTransitionShadowingDiag "warning"
+ }
+ Simulink.HardwareCC {
+ $ObjectID 6
+ Version "1.11.1"
+ ProdBitPerChar 8
+ ProdBitPerShort 16
+ ProdBitPerInt 32
+ ProdBitPerLong 32
+ ProdBitPerFloat 32
+ ProdBitPerDouble 64
+ ProdBitPerPointer 32
+ ProdLargestAtomicInteger "Char"
+ ProdLargestAtomicFloat "None"
+ ProdIntDivRoundTo "Undefined"
+ ProdEndianess "Unspecified"
+ ProdWordSize 32
+ ProdShiftRightIntArith on
+ ProdHWDeviceType "32-bit Generic"
+ TargetBitPerChar 8
+ TargetBitPerShort 16
+ TargetBitPerInt 32
+ TargetBitPerLong 32
+ TargetBitPerFloat 32
+ TargetBitPerDouble 64
+ TargetBitPerPointer 32
+ TargetLargestAtomicInteger "Char"
+ TargetLargestAtomicFloat "None"
+ TargetShiftRightIntArith on
+ TargetIntDivRoundTo "Undefined"
+ TargetEndianess "Unspecified"
+ TargetWordSize 32
+ TargetTypeEmulationWarnSuppressLevel 0
+ TargetPreprocMaxBitsSint 32
+ TargetPreprocMaxBitsUint 32
+ TargetHWDeviceType "Specified"
+ TargetUnknown on
+ ProdEqTarget on
+ }
+ Simulink.ModelReferenceCC {
+ $ObjectID 7
+ Version "1.11.1"
+ UpdateModelReferenceTargets "IfOutOfDateOrStructuralChange"
+ CheckModelReferenceTargetMessage "error"
+ EnableParallelModelReferenceBuilds off
+ ParallelModelReferenceErrorOnInvalidPool on
+ ParallelModelReferenceMATLABWorkerInit "None"
+ ModelReferenceNumInstancesAllowed "Multi"
+ PropagateVarSize "Infer from blocks in model"
+ ModelReferencePassRootInputsByReference on
+ ModelReferenceMinAlgLoopOccurrences off
+ PropagateSignalLabelsOutOfModel off
+ SupportModelReferenceSimTargetCustomCode off
+ }
+ Simulink.SFSimCC {
+ $ObjectID 8
+ Version "1.11.1"
+ SFSimEnableDebug on
+ SFSimOverflowDetection on
+ SFSimEcho on
+ SimBlas on
+ SimCtrlC on
+ SimExtrinsic on
+ SimIntegrity on
+ SimUseLocalCustomCode off
+ SimParseCustomCode on
+ SimBuildMode "sf_incremental_build"
+ }
+ Simulink.RTWCC {
+ $BackupClass "Simulink.RTWCC"
+ $ObjectID 9
+ Version "1.11.1"
+ Array {
+ Type "Cell"
+ Dimension 1
+ Cell "IncludeHyperlinkInReport"
+ PropName "DisabledProps"
+ }
+ SystemTargetFile "grt.tlc"
+ GenCodeOnly off
+ MakeCommand "make_rtw"
+ GenerateMakefile on
+ TemplateMakefile "grt_default_tmf"
+ GenerateReport off
+ SaveLog off
+ RTWVerbose on
+ RetainRTWFile off
+ ProfileTLC off
+ TLCDebug off
+ TLCCoverage off
+ TLCAssert off
+ ProcessScriptMode "Default"
+ ConfigurationMode "Optimized"
+ ConfigAtBuild off
+ RTWUseLocalCustomCode off
+ RTWUseSimCustomCode off
+ IncludeHyperlinkInReport off
+ LaunchReport off
+ TargetLang "C"
+ IncludeBusHierarchyInRTWFileBlockHierarchyMap off
+ IncludeERTFirstTime on
+ GenerateTraceInfo off
+ GenerateTraceReport off
+ GenerateTraceReportSl off
+ GenerateTraceReportSf off
+ GenerateTraceReportEml off
+ GenerateCodeInfo off
+ GenerateSLWebview off
+ GenerateCodeMetricsReport off
+ RTWCompilerOptimization "Off"
+ CheckMdlBeforeBuild "Off"
+ CustomRebuildMode "OnUpdate"
+ Array {
+ Type "Handle"
+ Dimension 2
+ Simulink.CodeAppCC {
+ $ObjectID 10
+ Version "1.11.1"
+ Array {
+ Type "Cell"
+ Dimension 16
+ Cell "IgnoreCustomStorageClasses"
+ Cell "InsertBlockDesc"
+ Cell "SFDataObjDesc"
+ Cell "SimulinkDataObjDesc"
+ Cell "DefineNamingRule"
+ Cell "SignalNamingRule"
+ Cell "ParamNamingRule"
+ Cell "InlinedPrmAccess"
+ Cell "CustomSymbolStr"
+ Cell "CustomSymbolStrGlobalVar"
+ Cell "CustomSymbolStrType"
+ Cell "CustomSymbolStrField"
+ Cell "CustomSymbolStrFcn"
+ Cell "CustomSymbolStrBlkIO"
+ Cell "CustomSymbolStrTmpVar"
+ Cell "CustomSymbolStrMacro"
+ PropName "DisabledProps"
+ }
+ ForceParamTrailComments off
+ GenerateComments on
+ IgnoreCustomStorageClasses off
+ IgnoreTestpoints off
+ IncHierarchyInIds off
+ MaxIdLength 31
+ PreserveName off
+ PreserveNameWithParent off
+ ShowEliminatedStatement on
+ IncAutoGenComments off
+ SimulinkDataObjDesc off
+ SFDataObjDesc off
+ MATLABFcnDesc off
+ IncDataTypeInIds off
+ MangleLength 1
+ CustomSymbolStrGlobalVar "$R$N$M"
+ CustomSymbolStrType "$N$R$M"
+ CustomSymbolStrField "$N$M"
+ CustomSymbolStrFcn "$R$N$M$F"
+ CustomSymbolStrFcnArg "rt$I$N$M"
+ CustomSymbolStrBlkIO "rtb_$N$M"
+ CustomSymbolStrTmpVar "$N$M"
+ CustomSymbolStrMacro "$R$N$M"
+ DefineNamingRule "None"
+ ParamNamingRule "None"
+ SignalNamingRule "None"
+ InsertBlockDesc off
+ InsertPolySpaceComments off
+ SimulinkBlockComments on
+ MATLABSourceComments off
+ EnableCustomComments off
+ InlinedPrmAccess "Literals"
+ ReqsInCode off
+ UseSimReservedNames off
+ }
+ Simulink.GRTTargetCC {
+ $BackupClass "Simulink.TargetCC"
+ $ObjectID 11
+ Version "1.11.1"
+ Array {
+ Type "Cell"
+ Dimension 12
+ Cell "IncludeMdlTerminateFcn"
+ Cell "CombineOutputUpdateFcns"
+ Cell "SuppressErrorStatus"
+ Cell "ERTCustomFileBanners"
+ Cell "GenerateSampleERTMain"
+ Cell "GenerateTestInterfaces"
+ Cell "MultiInstanceERTCode"
+ Cell "PurelyIntegerCode"
+ Cell "SupportNonInlinedSFcns"
+ Cell "SupportComplex"
+ Cell "SupportAbsoluteTime"
+ Cell "SupportContinuousTime"
+ PropName "DisabledProps"
+ }
+ TargetFcnLib "ansi_tfl_tmw.mat"
+ TargetLibSuffix ""
+ TargetPreCompLibLocation ""
+ TargetFunctionLibrary "ANSI_C"
+ UtilityFuncGeneration "Auto"
+ ERTMultiwordTypeDef "System defined"
+ CodeExecutionProfiling off
+ ERTMultiwordLength 256
+ MultiwordLength 2048
+ GenerateFullHeader on
+ GenerateSampleERTMain off
+ GenerateTestInterfaces off
+ IsPILTarget off
+ ModelReferenceCompliant on
+ ParMdlRefBuildCompliant on
+ CompOptLevelCompliant on
+ ConcurrentExecutionCompliant on
+ IncludeMdlTerminateFcn on
+ GeneratePreprocessorConditionals "Disable all"
+ CombineOutputUpdateFcns off
+ CombineSignalStateStructs off
+ SuppressErrorStatus off
+ ERTFirstTimeCompliant off
+ IncludeFileDelimiter "Auto"
+ ERTCustomFileBanners off
+ SupportAbsoluteTime on
+ LogVarNameModifier "rt_"
+ MatFileLogging on
+ MultiInstanceERTCode off
+ SupportNonFinite on
+ SupportComplex on
+ PurelyIntegerCode off
+ SupportContinuousTime on
+ SupportNonInlinedSFcns on
+ SupportVariableSizeSignals off
+ EnableShiftOperators on
+ ParenthesesLevel "Nominal"
+ PortableWordSizes off
+ ModelStepFunctionPrototypeControlCompliant off
+ CPPClassGenCompliant off
+ AutosarCompliant off
+ UseMalloc off
+ ExtMode off
+ ExtModeStaticAlloc off
+ ExtModeTesting off
+ ExtModeStaticAllocSize 1000000
+ ExtModeTransport 0
+ ExtModeMexFile "ext_comm"
+ ExtModeIntrfLevel "Level1"
+ RTWCAPISignals off
+ RTWCAPIParams off
+ RTWCAPIStates off
+ RTWCAPIRootIO off
+ GenerateASAP2 off
+ }
+ PropName "Components"
+ }
+ }
+ PropName "Components"
+ }
+ Name "Configuration"
+ CurrentDlgPage "Solver"
+ ConfigPrmDlgPosition [ 400, 210, 1280, 840 ]
+ }
+ PropName "ConfigurationSets"
+ }
+ Simulink.ConfigSet {
+ $PropName "ActiveConfigurationSet"
+ $ObjectID 1
+ }
+ BlockDefaults {
+ ForegroundColor "black"
+ BackgroundColor "white"
+ DropShadow off
+ NamePlacement "normal"
+ FontName "Helvetica"
+ FontSize 10
+ FontWeight "normal"
+ FontAngle "normal"
+ ShowName on
+ BlockRotation 0
+ BlockMirror off
+ }
+ AnnotationDefaults {
+ HorizontalAlignment "center"
+ VerticalAlignment "middle"
+ ForegroundColor "black"
+ BackgroundColor "white"
+ DropShadow off
+ FontName "Helvetica"
+ FontSize 10
+ FontWeight "normal"
+ FontAngle "normal"
+ UseDisplayTextAsClickCallback off
+ }
+ LineDefaults {
+ FontName "Helvetica"
+ FontSize 9
+ FontWeight "normal"
+ FontAngle "normal"
+ }
+ BlockParameterDefaults {
+ Block {
+ BlockType Constant
+ Value "1"
+ VectorParams1D on
+ SamplingMode "Sample based"
+ OutMin "[]"
+ OutMax "[]"
+ OutDataTypeStr "Inherit: Inherit from 'Constant value'"
+ LockScale off
+ SampleTime "inf"
+ FramePeriod "inf"
+ PreserveConstantTs off
+ }
+ Block {
+ BlockType Demux
+ Outputs "4"
+ DisplayOption "none"
+ BusSelectionMode off
+ }
+ Block {
+ BlockType DiscretePulseGenerator
+ PulseType "Sample based"
+ TimeSource "Use simulation time"
+ Amplitude "1"
+ Period "2"
+ PulseWidth "1"
+ PhaseDelay "0"
+ SampleTime "1"
+ VectorParams1D on
+ }
+ Block {
+ BlockType Display
+ Format "short"
+ Decimation "10"
+ Floating off
+ SampleTime "-1"
+ }
+ Block {
+ BlockType Inport
+ Port "1"
+ OutputFunctionCall off
+ OutMin "[]"
+ OutMax "[]"
+ OutDataTypeStr "Inherit: auto"
+ LockScale off
+ BusOutputAsStruct off
+ PortDimensions "-1"
+ VarSizeSig "Inherit"
+ SampleTime "-1"
+ SignalType "auto"
+ SamplingMode "auto"
+ LatchByDelayingOutsideSignal off
+ LatchInputForFeedbackSignals off
+ Interpolate on
+ }
+ Block {
+ BlockType Mux
+ Inputs "4"
+ DisplayOption "none"
+ UseBusObject off
+ BusObject "BusObject"
+ NonVirtualBus off
+ }
+ Block {
+ BlockType Outport
+ Port "1"
+ OutMin "[]"
+ OutMax "[]"
+ OutDataTypeStr "Inherit: auto"
+ LockScale off
+ BusOutputAsStruct off
+ PortDimensions "-1"
+ VarSizeSig "Inherit"
+ SampleTime "-1"
+ SignalType "auto"
+ SamplingMode "auto"
+ SourceOfInitialOutputValue "Dialog"
+ OutputWhenDisabled "held"
+ InitialOutput "[]"
+ }
+ Block {
+ BlockType Scope
+ ModelBased off
+ TickLabels "OneTimeTick"
+ ZoomMode "on"
+ Grid "on"
+ TimeRange "auto"
+ YMin "-5"
+ YMax "5"
+ SaveToWorkspace off
+ SaveName "ScopeData"
+ LimitDataPoints on
+ MaxDataPoints "5000"
+ Decimation "1"
+ SampleInput off
+ SampleTime "-1"
+ }
+ Block {
+ BlockType SignalSpecification
+ OutMin "[]"
+ OutMax "[]"
+ OutDataTypeStr "Inherit: auto"
+ LockScale off
+ BusOutputAsStruct off
+ Dimensions "-1"
+ VarSizeSig "Inherit"
+ SampleTime "-1"
+ SignalType "auto"
+ SamplingMode "auto"
+ }
+ Block {
+ BlockType SubSystem
+ ShowPortLabels "FromPortIcon"
+ Permissions "ReadWrite"
+ PermitHierarchicalResolution "All"
+ TreatAsAtomicUnit off
+ CheckFcnCallInpInsideContextMsg off
+ SystemSampleTime "-1"
+ RTWFcnNameOpts "Auto"
+ RTWFileNameOpts "Auto"
+ RTWMemSecFuncInitTerm "Inherit from model"
+ RTWMemSecFuncExecute "Inherit from model"
+ RTWMemSecDataConstants "Inherit from model"
+ RTWMemSecDataInternal "Inherit from model"
+ RTWMemSecDataParameters "Inherit from model"
+ SimViewingDevice off
+ DataTypeOverride "UseLocalSettings"
+ DataTypeOverrideAppliesTo "AllNumericTypes"
+ MinMaxOverflowLogging "UseLocalSettings"
+ SFBlockType "NONE"
+ Variant off
+ GeneratePreprocessorConditionals off
+ }
+ Block {
+ BlockType Sum
+ IconShape "rectangular"
+ Inputs "++"
+ CollapseMode "All dimensions"
+ CollapseDim "1"
+ InputSameDT on
+ AccumDataTypeStr "Inherit: Inherit via internal rule"
+ OutMin "[]"
+ OutMax "[]"
+ OutDataTypeStr "Inherit: Same as first input"
+ LockScale off
+ RndMeth "Floor"
+ SaturateOnIntegerOverflow on
+ SampleTime "-1"
+ }
+ }
+ System {
+ Name "send_receive"
+ Location [611, 495, 1431, 1394]
+ Open on
+ ModelBrowserVisibility off
+ ModelBrowserWidth 247
+ ScreenColor "white"
+ PaperOrientation "landscape"
+ PaperPositionMode "auto"
+ PaperType "usletter"
+ PaperUnits "inches"
+ TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000]
+ TiledPageScale 1
+ ShowPageBoundaries off
+ ZoomFactor "100"
+ ReportName "simulink-default.rpt"
+ SIDHighWatermark "44"
+ Block {
+ BlockType SubSystem
+ Name "sc_console"
+ SID "3"
+ Ports [3]
+ Position [410, 98, 610, 192]
+ BackgroundColor "lightBlue"
+ MinAlgLoopOccurrences off
+ PropExecContextOutsideSubsystem off
+ RTWSystemCode "Auto"
+ FunctionWithSeparateData off
+ Opaque off
+ RequestExecContextInheritance off
+ MaskHideContents off
+ System {
+ Name "sc_console"
+ Location [-17, 82, 1626, 997]
+ Open on
+ ModelBrowserVisibility off
+ ModelBrowserWidth 200
+ ScreenColor "white"
+ PaperOrientation "landscape"
+ PaperPositionMode "auto"
+ PaperType "A4"
+ PaperUnits "centimeters"
+ TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000]
+ TiledPageScale 1
+ ShowPageBoundaries off
+ ZoomFactor "206"
+ Block {
+ BlockType Inport
+ Name "data recv"
+ SID "4"
+ Position [140, 168, 170, 182]
+ BackgroundColor "yellow"
+ IconDisplay "Port number"
+ }
+ Block {
+ BlockType Inport
+ Name "errors_status"
+ SID "5"
+ Position [140, 128, 170, 142]
+ BackgroundColor "yellow"
+ Port "2"
+ IconDisplay "Port number"
+ }
+ Block {
+ BlockType Inport
+ Name "data send"
+ SID "29"
+ Position [140, 208, 170, 222]
+ BackgroundColor "yellow"
+ Port "3"
+ IconDisplay "Port number"
+ }
+ Block {
+ BlockType Demux
+ Name "Demux"
+ SID "6"
+ Ports [1, 2]
+ Position [285, 116, 290, 154]
+ BackgroundColor "black"
+ ShowName off
+ Outputs "[2 1]"
+ }
+ Block {
+ BlockType Demux
+ Name "Demux1"
+ SID "32"
+ Ports [1, 5]
+ Position [375, 211, 380, 299]
+ ShowName off
+ Outputs "5"
+ DisplayOption "bar"
+ }
+ Block {
+ BlockType Demux
+ Name "Demux2"
+ SID "39"
+ Ports [1, 5]
+ Position [375, 306, 380, 394]
+ ShowName off
+ Outputs "5"
+ DisplayOption "bar"
+ }
+ Block {
+ BlockType Mux
+ Name "Mux"
+ SID "34"
+ Ports [2, 1]
+ Position [465, 246, 470, 284]
+ ShowName off
+ Inputs "2"
+ DisplayOption "bar"
+ }
+ Block {
+ BlockType Reference
+ Name "OpComm"
+ SID "9"
+ Ports [3, 3]
+ Position [225, 138, 265, 212]
+ LibraryVersion "1.348"
+ SourceBlock "rtlab/OpComm"
+ SourceType "RT-LAB OpComm"
+ nbport "3"
+ groupe_acq "1"
+ subsys_rate "0"
+ st "0"
+ Synchronization on
+ Interpolation on
+ Threshold "1.0"
+ Missed_Data off
+ Offset off
+ Sim_Time off
+ Samples off
+ dynSigOut off
+ from_console "0"
+ warning_done off
+ writeOpCommFile off
+ }
+ Block {
+ BlockType Sum
+ Name "Subtract"
+ SID "42"
+ Ports [2, 1]
+ Position [510, 312, 540, 343]
+ ZOrder -31
+ Inputs "+-"
+ InputSameDT off
+ OutDataTypeStr "Inherit: Inherit via internal rule"
+ SaturateOnIntegerOverflow off
+ }
+ Block {
+ BlockType Display
+ Name "errors"
+ SID "10"
+ Ports [1]
+ Position [385, 82, 455, 128]
+ BackgroundColor "yellow"
+ FontName "Arial"
+ FontSize 8
+ Decimation "1"
+ Lockdown off
+ }
+ Block {
+ BlockType Scope
+ Name "message 1"
+ SID "40"
+ Ports [1]
+ Position [590, 169, 620, 201]
+ BackgroundColor "yellow"
+ Floating off
+ Location [826, 517, 1334, 952]
+ Open off
+ NumInputPorts "1"
+ List {
+ ListType AxesTitles
+ axes1 "%"
+ }
+ List {
+ ListType ScopeGraphics
+ FigureColor "[0.5 0.5 0.5]"
+ AxesColor "[0 0 0]"
+ AxesTickColor "[1 1 1]"
+ LineColors "[1 1 0;1 0 1;0 1 1;1 0 0;0 1 0;0 0 1]"
+ LineStyles "-|-|-|-|-|-"
+ LineWidths "[0.5 0.5 0.5 0.5 0.5 0.5]"
+ MarkerStyles "none|none|none|none|none|none"
+ }
+ YMin "-1.75"
+ YMax "4"
+ SaveName "ScopeData1"
+ DataFormat "StructureWithTime"
+ SampleTime "0"
+ }
+ Block {
+ BlockType Scope
+ Name "message 2"
+ SID "33"
+ Ports [1]
+ Position [590, 249, 620, 281]
+ BackgroundColor "yellow"
+ Floating off
+ Location [826, 517, 1334, 952]
+ Open off
+ NumInputPorts "1"
+ List {
+ ListType AxesTitles
+ axes1 "%"
+ }
+ List {
+ ListType ScopeGraphics
+ FigureColor "[0.5 0.5 0.5]"
+ AxesColor "[0 0 0]"
+ AxesTickColor "[1 1 1]"
+ LineColors "[1 1 0;1 0 1;0 1 1;1 0 0;0 1 0;0 0 1]"
+ LineStyles "-|-|-|-|-|-"
+ LineWidths "[0.5 0.5 0.5 0.5 0.5 0.5]"
+ MarkerStyles "none|none|none|none|none|none"
+ }
+ YMin "-1.75"
+ YMax "4"
+ DataFormat "StructureWithTime"
+ SampleTime "0"
+ }
+ Block {
+ BlockType Scope
+ Name "message 3"
+ SID "41"
+ Ports [1]
+ Position [590, 389, 620, 421]
+ BackgroundColor "yellow"
+ Floating off
+ Location [826, 517, 1334, 952]
+ Open off
+ NumInputPorts "1"
+ List {
+ ListType AxesTitles
+ axes1 "%"
+ }
+ List {
+ ListType ScopeGraphics
+ FigureColor "[0.5 0.5 0.5]"
+ AxesColor "[0 0 0]"
+ AxesTickColor "[1 1 1]"
+ LineColors "[1 1 0;1 0 1;0 1 1;1 0 0;0 1 0;0 0 1]"
+ LineStyles "-|-|-|-|-|-"
+ LineWidths "[0.5 0.5 0.5 0.5 0.5 0.5]"
+ MarkerStyles "none|none|none|none|none|none"
+ }
+ YMin "-1.75"
+ YMax "4"
+ SaveName "ScopeData2"
+ DataFormat "StructureWithTime"
+ SampleTime "0"
+ }
+ Block {
+ BlockType Scope
+ Name "message 4"
+ SID "43"
+ Ports [1]
+ Position [590, 314, 620, 346]
+ BackgroundColor "yellow"
+ Floating off
+ Location [826, 517, 1334, 952]
+ Open off
+ NumInputPorts "1"
+ List {
+ ListType AxesTitles
+ axes1 "%"
+ }
+ List {
+ ListType ScopeGraphics
+ FigureColor "[0.5 0.5 0.5]"
+ AxesColor "[0 0 0]"
+ AxesTickColor "[1 1 1]"
+ LineColors "[1 1 0;1 0 1;0 1 1;1 0 0;0 1 0;0 0 1]"
+ LineStyles "-|-|-|-|-|-"
+ LineWidths "[0.5 0.5 0.5 0.5 0.5 0.5]"
+ MarkerStyles "none|none|none|none|none|none"
+ }
+ YMin "-1.75"
+ YMax "4"
+ SaveName "ScopeData3"
+ DataFormat "StructureWithTime"
+ SampleTime "0"
+ }
+ Block {
+ BlockType Display
+ Name "reception status"
+ SID "12"
+ Ports [1]
+ Position [390, 148, 450, 172]
+ BackgroundColor "yellow"
+ FontName "Arial"
+ FontSize 8
+ Decimation "1"
+ Lockdown off
+ }
+ Line {
+ SrcBlock "errors_status"
+ SrcPort 1
+ Points [25, 0; 0, 15]
+ DstBlock "OpComm"
+ DstPort 1
+ }
+ Line {
+ SrcBlock "OpComm"
+ SrcPort 2
+ Points [35, 0; 0, 80]
+ Branch {
+ Labels [1, 0]
+ DstBlock "Demux1"
+ DstPort 1
+ }
+ Branch {
+ Points [0, -70]
+ DstBlock "message 1"
+ DstPort 1
+ }
+ }
+ Line {
+ SrcBlock "data recv"
+ SrcPort 1
+ DstBlock "OpComm"
+ DstPort 2
+ }
+ Line {
+ SrcBlock "OpComm"
+ SrcPort 1
+ DstBlock "Demux"
+ DstPort 1
+ }
+ Line {
+ SrcBlock "Demux"
+ SrcPort 1
+ Points [45, 0; 0, -20]
+ DstBlock "errors"
+ DstPort 1
+ }
+ Line {
+ SrcBlock "Demux"
+ SrcPort 2
+ Points [45, 0; 0, 15]
+ DstBlock "reception status"
+ DstPort 1
+ }
+ Line {
+ Labels [0, 0]
+ SrcBlock "Mux"
+ SrcPort 1
+ DstBlock "message 2"
+ DstPort 1
+ }
+ Line {
+ SrcBlock "data send"
+ SrcPort 1
+ Points [25, 0; 0, -15]
+ DstBlock "OpComm"
+ DstPort 3
+ }
+ Line {
+ SrcBlock "OpComm"
+ SrcPort 3
+ Points [15, 0; 0, 150]
+ Branch {
+ Points [0, 0]
+ DstBlock "Demux2"
+ DstPort 1
+ }
+ Branch {
+ Points [0, 55]
+ DstBlock "message 3"
+ DstPort 1
+ }
+ }
+ Line {
+ SrcBlock "Subtract"
+ SrcPort 1
+ DstBlock "message 4"
+ DstPort 1
+ }
+ Line {
+ Labels [1, 0]
+ SrcBlock "Demux1"
+ SrcPort 5
+ Points [20, 0; 0, -30]
+ Branch {
+ DstBlock "Mux"
+ DstPort 1
+ }
+ Branch {
+ Points [0, 65]
+ DstBlock "Subtract"
+ DstPort 1
+ }
+ }
+ Line {
+ SrcBlock "Demux2"
+ SrcPort 5
+ Points [35, 0; 0, -45]
+ Branch {
+ Points [0, -60]
+ DstBlock "Mux"
+ DstPort 2
+ }
+ Branch {
+ DstBlock "Subtract"
+ DstPort 2
+ }
+ }
+ Annotation {
+ Name "Simple analysis of round trip time"
+ Position [293, 52]
+ FontName "Verdana"
+ FontSize 14
+ FontWeight "bold"
+ }
+ }
+ }
+ Block {
+ BlockType SubSystem
+ Name "sm_model"
+ SID "13"
+ Ports [0, 3]
+ Position [55, 97, 235, 193]
+ BackgroundColor "lightBlue"
+ MinAlgLoopOccurrences off
+ PropExecContextOutsideSubsystem off
+ RTWSystemCode "Auto"
+ FunctionWithSeparateData off
+ Opaque off
+ RequestExecContextInheritance off
+ MaskHideContents off
+ System {
+ Name "sm_model"
+ Location [2, 82, 1662, 980]
+ Open off
+ ModelBrowserVisibility off
+ ModelBrowserWidth 200
+ ScreenColor "white"
+ PaperOrientation "landscape"
+ PaperPositionMode "auto"
+ PaperType "A4"
+ PaperUnits "centimeters"
+ TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000]
+ TiledPageScale 1
+ ShowPageBoundaries off
+ ZoomFactor "180"
+ Block {
+ BlockType Mux
+ Name "Mux"
+ SID "16"
+ Ports [3, 1]
+ Position [870, 140, 875, 190]
+ ShowName off
+ Inputs "3"
+ DisplayOption "bar"
+ }
+ Block {
+ BlockType Mux
+ Name "Mux1"
+ SID "17"
+ Ports [2, 1]
+ Position [290, 209, 295, 271]
+ BackgroundColor "yellow"
+ ShowName off
+ Inputs "2"
+ DisplayOption "bar"
+ }
+ Block {
+ BlockType Reference
+ Name "OpIPSocketCtrl1"
+ SID "18"
+ Ports []
+ Position [105, 112, 234, 173]
+ LibraryVersion "1.10"
+ SourceBlock "rtio_generic_ip/OpIPSocketCtrl"
+ SourceType "OpAsyncIPCtrl"
+ ctl_id "1"
+ proto "UDP/IP"
+ ip_addr_remote "134.130.169.31"
+ ip_port_remote "10200"
+ ip_port_local "10201"
+ ip_addr_mcast "0.0.0.0"
+ exe_name "AsyncIP"
+ }
+ Block {
+ BlockType DiscretePulseGenerator
+ Name "Pulse\nGenerator"
+ SID "44"
+ Ports [0, 1]
+ Position [190, 238, 240, 272]
+ ZOrder -13
+ BackgroundColor "yellow"
+ PulseType "Time based"
+ Amplitude "5"
+ Period "0.1"
+ PulseWidth "30"
+ }
+ Block {
+ BlockType Constant
+ Name "constants"
+ SID "19"
+ Position [180, 216, 250, 234]
+ BackgroundColor "yellow"
+ NamePlacement "alternate"
+ Value "[1 2 3 4]"
+ }
+ Block {
+ BlockType DiscretePulseGenerator
+ Name "data ready 1 kHz"
+ SID "20"
+ Ports [0, 1]
+ Position [290, 131, 335, 149]
+ NamePlacement "alternate"
+ SampleTime "0.001"
+ }
+ Block {
+ BlockType Reference
+ Name "receive message 1"
+ SID "21"
+ Ports [1, 3]
+ Position [625, 159, 800, 201]
+ LibraryVersion "1.348"
+ SourceBlock "rtlab/Communication/Asynchronous/OpAsyncRecv"
+ SourceType "OpAsyncRecv"
+ ctl_id "1"
+ recv_id "1"
+ enable_param off
+ fp1 "1"
+ fp2 "2"
+ fp3 "3"
+ fp4 "4"
+ fp5 "5"
+ sp1 "string1"
+ sp2 "string2"
+ sp3 "string3"
+ sp4 "string4"
+ sp5 "string5"
+ }
+ Block {
+ BlockType Reference
+ Name "send message 1"
+ SID "22"
+ Ports [2, 1]
+ Position [375, 129, 545, 171]
+ LibraryVersion "1.348"
+ SourceBlock "rtlab/Communication/Asynchronous/OpAsyncSend"
+ SourceType "OpAsyncSend"
+ ctl_id "1"
+ send_id "1"
+ mode "DONT_NEED_REPLY"
+ enable_param off
+ fp1 "1"
+ fp2 "2"
+ fp3 "3"
+ fp4 "4"
+ fp5 "5"
+ sp1 "string1"
+ sp2 "string2"
+ sp3 "string3"
+ sp4 "string4"
+ sp5 "string5"
+ }
+ Block {
+ BlockType SignalSpecification
+ Name "set width"
+ SID "23"
+ Position [830, 187, 855, 203]
+ Dimensions "5"
+ }
+ Block {
+ BlockType Constant
+ Name "timeout"
+ SID "25"
+ Position [580, 173, 610, 187]
+ Value "2"
+ }
+ Block {
+ BlockType Outport
+ Name "data recv"
+ SID "26"
+ Position [915, 187, 950, 203]
+ BackgroundColor "yellow"
+ IconDisplay "Port number"
+ }
+ Block {
+ BlockType Outport
+ Name "errors_status"
+ SID "27"
+ Position [915, 142, 950, 158]
+ BackgroundColor "yellow"
+ Port "2"
+ IconDisplay "Port number"
+ }
+ Block {
+ BlockType Outport
+ Name "data send"
+ SID "28"
+ Position [915, 232, 950, 248]
+ BackgroundColor "yellow"
+ Port "3"
+ IconDisplay "Port number"
+ }
+ Line {
+ SrcBlock "receive message 1"
+ SrcPort 3
+ DstBlock "set width"
+ DstPort 1
+ }
+ Line {
+ SrcBlock "receive message 1"
+ SrcPort 1
+ DstBlock "Mux"
+ DstPort 2
+ }
+ Line {
+ SrcBlock "receive message 1"
+ SrcPort 2
+ DstBlock "Mux"
+ DstPort 3
+ }
+ Line {
+ SrcBlock "timeout"
+ SrcPort 1
+ DstBlock "receive message 1"
+ DstPort 1
+ }
+ Line {
+ SrcBlock "send message 1"
+ SrcPort 1
+ DstBlock "Mux"
+ DstPort 1
+ }
+ Line {
+ SrcBlock "Mux"
+ SrcPort 1
+ Points [0, -15]
+ DstBlock "errors_status"
+ DstPort 1
+ }
+ Line {
+ SrcBlock "set width"
+ SrcPort 1
+ DstBlock "data recv"
+ DstPort 1
+ }
+ Line {
+ SrcBlock "constants"
+ SrcPort 1
+ DstBlock "Mux1"
+ DstPort 1
+ }
+ Line {
+ Labels [0, 0]
+ SrcBlock "Mux1"
+ SrcPort 1
+ Points [45, 0]
+ Branch {
+ Points [0, -80]
+ DstBlock "send message 1"
+ DstPort 2
+ }
+ Branch {
+ Labels [1, 0]
+ DstBlock "data send"
+ DstPort 1
+ }
+ }
+ Line {
+ SrcBlock "data ready 1 kHz"
+ SrcPort 1
+ DstBlock "send message 1"
+ DstPort 1
+ }
+ Line {
+ SrcBlock "Pulse\nGenerator"
+ SrcPort 1
+ DstBlock "Mux1"
+ DstPort 2
+ }
+ Annotation {
+ Name "Simple S2SS to OPAL test using UDP messages"
+ Position [288, 52]
+ FontName "Verdana"
+ FontSize 14
+ FontWeight "bold"
+ }
+ }
+ }
+ Line {
+ SrcBlock "sm_model"
+ SrcPort 1
+ DstBlock "sc_console"
+ DstPort 1
+ }
+ Line {
+ SrcBlock "sm_model"
+ SrcPort 2
+ DstBlock "sc_console"
+ DstPort 2
+ }
+ Line {
+ Labels [0, 0]
+ SrcBlock "sm_model"
+ SrcPort 3
+ DstBlock "sc_console"
+ DstPort 3
+ }
+ }
+}
diff --git a/clients/opal/models/send_receive/src/AsyncIP.c b/clients/opal/models/send_receive/src/AsyncIP.c
new file mode 100644
index 000000000..fb26aeaa6
--- /dev/null
+++ b/clients/opal/models/send_receive/src/AsyncIP.c
@@ -0,0 +1,294 @@
+/** AsyncIP
+ *
+ * Code example of an asynchronous program. This program is started
+ * by the asynchronous controller and demonstrates how to send and
+ * receive data to and from the asynchronous icons and a UDP or TCP
+ * port.
+ *
+ * @author Steffen Vogel
+ * @author Mathieu Dubé-Dallaire
+ * @copyright 2014, Institute for Automation of Complex Power Systems, EONERC
+ * @copyright 2003, OPAL-RT Technologies inc
+ * @file
+ */
+
+/* Standard ANSI C headers needed for this program */
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#if defined(__QNXNTO__)
+# include
+# include
+# include
+# include
+#elif defined(__linux__)
+# define _GNU_SOURCE 1
+#endif
+
+/* Define RTLAB before including OpalPrint.h for messages to be sent
+ * to the OpalDisplay. Otherwise stdout will be used. */
+#define RTLAB
+#include "OpalPrint.h"
+#include "AsyncApi.h"
+
+/* This is the message format */
+#include "Config.h"
+#include "MsgFormat.h"
+#include "Socket.h"
+#include "Interface.h"
+
+/* This is just for initializing the shared memory access to communicate
+ * with the RT-LAB model. It's easier to remember the arguments like this */
+#define ASYNC_SHMEM_NAME argv[1]
+#define ASYNC_SHMEM_SIZE atoi(argv[2])
+#define PRINT_SHMEM_NAME argv[3]
+
+static void *SendToIPPort(void *arg)
+{
+ unsigned SendID = 1;
+ unsigned i, n;
+ int nbSend = 0;
+ unsigned ModelState;
+
+ /* Data from OPAL-RT model */
+ double mdldata[MSG_VALUES];
+ int mdldata_size;
+
+ /* Data from the S2SS server */
+ struct msg msg = MSG_INIT(0);
+ int msg_size;
+
+ OpalPrint("%s: SendToIPPort thread started\n", PROGNAME);
+
+ OpalGetNbAsyncSendIcon(&nbSend);
+ if (nbSend >= 1) {
+ do {
+ /* This call unblocks when the 'Data Ready' line of a send icon is asserted. */
+ if ((n = OpalWaitForAsyncSendRequest(&SendID)) != EOK) {
+ ModelState = OpalGetAsyncModelState();
+ if ((ModelState != STATE_RESET) && (ModelState != STATE_STOP)) {
+ OpalSetAsyncSendIconError(n, SendID);
+ OpalPrint("%s: OpalWaitForAsyncSendRequest(), errno %d\n", PROGNAME, n);
+ }
+
+ continue;
+ }
+
+ /* No errors encountered yet */
+ OpalSetAsyncSendIconError(0, SendID);
+
+ /* Get the size of the data being sent by the unblocking SendID */
+ OpalGetAsyncSendIconDataLength(&mdldata_size, SendID);
+ if (mdldata_size / sizeof(double) > MSG_VALUES) {
+ OpalPrint("%s: Number of signals for SendID=%d exceeds allowed maximum (%d)\n",
+ PROGNAME, SendID, MSG_VALUES);
+
+ return NULL;
+ }
+
+ /* Read data from the model */
+ OpalGetAsyncSendIconData(mdldata, mdldata_size, SendID);
+
+/******* FORMAT TO SPECIFIC PROTOCOL HERE *****************************/
+ // msg.dev_id = SendID; /* Use the SendID as a device ID here */
+ msg.sequence++;
+ msg.length = mdldata_size / sizeof(double);
+
+ for (i = 0; i < msg.length; i++)
+ msg.data[i] = (float) mdldata[i];
+
+ msg_size = 4 * (msg.length + 1);
+/**********************************************************************/
+
+ /* Perform the actual write to the ip port */
+ if (SendPacket((char *) &msg, msg_size) < 0)
+ OpalSetAsyncSendIconError(errno, SendID);
+ else
+ OpalSetAsyncSendIconError(0, SendID);
+
+ /* This next call allows the execution of the "asynchronous" process
+ * to actually be synchronous with the model. To achieve this, you
+ * should set the "Sending Mode" in the Async_Send block to
+ * NEED_REPLY_BEFORE_NEXT_SEND or NEED_REPLY_NOW. This will force
+ * the model to wait for this process to call this
+ * OpalAsyncSendRequestDone function before continuing. */
+ OpalAsyncSendRequestDone(SendID);
+
+ /* Before continuing, we make sure that the real-time model
+ * has not been stopped. If it has, we quit. */
+ ModelState = OpalGetAsyncModelState();
+ } while ((ModelState != STATE_RESET) && (ModelState != STATE_STOP));
+
+ OpalPrint("%s: SendToIPPort: Finished\n", PROGNAME);
+ }
+ else {
+ OpalPrint("%s: SendToIPPort: No transimission block for this controller. Stopping thread.\n", PROGNAME);
+ }
+
+ return NULL;
+}
+
+static void *RecvFromIPPort(void *arg)
+{
+ unsigned RecvID = 1;
+ unsigned i, n;
+ int nbRecv = 0;
+ unsigned ModelState;
+
+ /* Data from OPAL-RT model */
+ double mdldata[MSG_VALUES];
+ int mdldata_size;
+
+ /* Data from the S2SS server */
+ struct msg msg = MSG_INIT(0);
+ unsigned msg_size;
+
+ OpalPrint("%s: RecvFromIPPort thread started\n", PROGNAME);
+
+ OpalGetNbAsyncRecvIcon(&nbRecv);
+ if (nbRecv >= 1) {
+ do {
+
+/******* FORMAT TO SPECIFIC PROTOCOL HERE ******************************/
+ msg_size = sizeof(msg);
+ n = RecvPacket((char *) &msg, msg_size, 1.0);
+
+ if (msg.version != MSG_VERSION) {
+ OpalPrint("%s: Received message with unknown version. Skipping..\n", PROGNAME);
+ continue;
+ }
+
+ if (msg.type != MSG_TYPE_DATA) {
+ OpalPrint("%s: Received no data. Skipping..\n", PROGNAME);
+ continue;
+ }
+
+ msg_size = 4 * (msg.length + 1);
+/***********************************************************************/
+
+ if (n < 1) {
+ ModelState = OpalGetAsyncModelState();
+ if ((ModelState != STATE_RESET) && (ModelState != STATE_STOP)) {
+ // n == 0 means timeout, so we continue silently
+ //if (n == 0)
+ // OpalPrint("%s: Timeout while waiting for data\n", PROGNAME, errno);
+ // n == -1 means a more serious error, so we print it
+ if (n == -1)
+ OpalPrint("%s: Error %d while waiting for data\n", PROGNAME, errno);
+ continue;
+ }
+ break;
+ }
+ else if (n != msg_size) {
+ OpalPrint("%s: Received incoherent packet (size: %d, complete: %d)\n", PROGNAME, n, msg_size);
+ continue;
+ }
+
+/******* FORMAT TO SPECIFIC PROTOCOL HERE *******************************/
+ OpalSetAsyncRecvIconStatus(msg.sequence, RecvID); /* Set the Status to the message ID */
+ OpalSetAsyncRecvIconError(0, RecvID); /* Set the Error to 0 */
+
+ /* Get the number of signals to send back to the model */
+ OpalGetAsyncRecvIconDataLength(&mdldata_size, RecvID);
+
+ if (mdldata_size / sizeof(double) > MSG_VALUES) {
+ OpalPrint("%s: Number of signals for RecvID=%d (%d) exceeds allowed maximum (%d)\n",
+ PROGNAME, RecvID, mdldata_size / sizeof(double), MSG_VALUES);
+ return NULL;
+ }
+
+ if (mdldata_size / sizeof(double) > msg.length) {
+ OpalPrint("%s: Number of signals for RecvID=%d (%d) exceeds what was received (%d)\n",
+ PROGNAME, RecvID, mdldata_size / sizeof(double), msg.length);
+ }
+
+ for (i = 0; i < msg.length; i++)
+ mdldata[i] = (double) msg.data[i];
+/************************************************************************/
+
+ OpalSetAsyncRecvIconData(mdldata, mdldata_size, RecvID);
+
+ /* Before continuing, we make sure that the real-time model
+ * has not been stopped. If it has, we quit. */
+ ModelState = OpalGetAsyncModelState();
+ } while ((ModelState != STATE_RESET) && (ModelState != STATE_STOP));
+
+ OpalPrint("%s: RecvFromIPPort: Finished\n", PROGNAME);
+ }
+ else {
+ OpalPrint("%s: RecvFromIPPort: No reception block for this controller. Stopping thread.\n", PROGNAME);
+ }
+
+ return NULL;
+}
+
+int main(int argc, char *argv[])
+{
+ int err;
+
+ Opal_GenAsyncParam_Ctrl IconCtrlStruct;
+
+ pthread_t tid_send, tid_recv;
+ pthread_attr_t attr_send, attr_recv;
+
+ OpalPrint("%s: This is a S2SS client\n", PROGNAME);
+
+ /* Check for the proper arguments to the program */
+ if (argc < 4) {
+ printf("Invalid Arguments: 1-AsyncShmemName 2-AsyncShmemSize 3-PrintShmemName\n");
+ exit(0);
+ }
+
+ /* Enable the OpalPrint function. This prints to the OpalDisplay. */
+ if (OpalSystemCtrl_Register(PRINT_SHMEM_NAME) != EOK) {
+ printf("%s: ERROR: OpalPrint() access not available\n", PROGNAME);
+ exit(EXIT_FAILURE);
+ }
+
+ /* Open Share Memory created by the model. */
+ if ((OpalOpenAsyncMem(ASYNC_SHMEM_SIZE, ASYNC_SHMEM_NAME)) != EOK) {
+ OpalPrint("%s: ERROR: Model shared memory not available\n", PROGNAME);
+ exit(EXIT_FAILURE);
+ }
+
+ /* For Redhawk, Assign this process to CPU 0 in order to support partial XHP */
+ AssignProcToCpu0();
+
+ /* Get IP Controler Parameters (ie: ip address, port number...) and
+ * initialize the device on the QNX node. */
+ memset(&IconCtrlStruct, 0, sizeof(IconCtrlStruct));
+ if ((err = OpalGetAsyncCtrlParameters(&IconCtrlStruct, sizeof(IconCtrlStruct))) != EOK) {
+ OpalPrint("%s: ERROR: Could not get controller parameters (%d).\n", PROGNAME, err);
+ exit(EXIT_FAILURE);
+ }
+
+ if (InitSocket(IconCtrlStruct) != EOK) {
+ OpalPrint("%s: ERROR: Initialization failed.\n", PROGNAME);
+ exit(EXIT_FAILURE);
+ }
+
+ /* Start send/receive threads */
+ if ((pthread_create(&tid_send, NULL, SendToIPPort, NULL)) == -1)
+ OpalPrint("%s: ERROR: Could not create thread (SendToIPPort), errno %d\n", PROGNAME, errno);
+ if ((pthread_create(&tid_recv, NULL, RecvFromIPPort, NULL)) == -1)
+ OpalPrint("%s: ERROR: Could not create thread (RecvFromIPPort), errno %d\n", PROGNAME, errno);
+
+ /* Wait for both threads to finish */
+ if ((err = pthread_join(tid_send, NULL)) != 0)
+ OpalPrint("%s: ERROR: pthread_join (SendToIPPort), errno %d\n", PROGNAME, err);
+ if ((err = pthread_join(tid_recv, NULL)) != 0)
+ OpalPrint("%s: ERROR: pthread_join (RecvFromIPPort), errno %d\n", PROGNAME, err);
+
+ /* Close the ip port and shared memories */
+ CloseSocket(IconCtrlStruct);
+ OpalCloseAsyncMem (ASYNC_SHMEM_SIZE, ASYNC_SHMEM_NAME);
+ OpalSystemCtrl_UnRegister(PRINT_SHMEM_NAME);
+
+ return 0;
+}
diff --git a/clients/opal/models/send_receive/src/Interface.c b/clients/opal/models/send_receive/src/Interface.c
new file mode 100644
index 000000000..97b5d6017
--- /dev/null
+++ b/clients/opal/models/send_receive/src/Interface.c
@@ -0,0 +1,26 @@
+/** OPAL Interface setup
+ *
+ * @author Steffen Vogel
+ * @copyright 2014, Institute for Automation of Complex Power Systems, EONERC
+ * @file
+ */
+
+#include "Config.h"
+#include "Interface.h"
+
+int if_setup(const char *op, const char *iface, const char *addr)
+{
+ char cmd[256];
+
+ /* Setup remote address */
+ snprintf(cmd, 256, "ip addr %s %s/32 dev %s", op, addr, iface);
+ if (system(cmd))
+ OpalPrint("Failed to add local address to interface");
+
+ /* Setup route for single IP address */
+ snprintf(cmd, 256, "ip route %s %s/32 dev %s", op, addr, iface);
+ if (system(cmd))
+ OpalPrint("Failed to add route for remote address");
+
+ return 0;
+}
diff --git a/clients/opal/models/send_receive/src/Sched.c b/clients/opal/models/send_receive/src/Sched.c
new file mode 100644
index 000000000..f4744fcc9
--- /dev/null
+++ b/clients/opal/models/send_receive/src/Sched.c
@@ -0,0 +1,74 @@
+/** Configure Scheduler
+ *
+ * @author Steffen Vogel
+ * @author Mathieu Dubé-Dallaire
+ * @copyright 2014, Institute for Automation of Complex Power Systems, EONERC
+ * @copyright 2003, OPAL-RT Technologies inc
+ * @file
+ */
+
+#include
+
+/* Define RTLAB before including OpalPrint.h for messages to be sent
+ * to the OpalDisplay. Otherwise stdout will be used. */
+#define RTLAB
+#include "OpalPrint.h"
+
+#include "Config.h"
+#include "Sched.h"
+
+#if defined(__QNXNTO__)
+# include
+# include
+# include
+# include
+#elif defined(__linux__)
+# define _GNU_SOURCE 1
+# include
+# if defined(__redhawk__)
+# include
+# include
+# endif
+#endif
+
+int AssignProcToCpu0(void)
+{
+#if defined(__linux__)
+ #if defined(__redhawk__)
+ int rc;
+ pid_t pid = getpid();
+ cpuset_t *pCpuset;
+
+ pCpuset = cpuset_alloc();
+ if (NULL == pCpuset) {
+ OpalPrint("Error allocating a cpuset\n");
+ return ENOMEM;
+ }
+
+ cpuset_init(pCpuset);
+ cpuset_set_cpu(pCpuset, 0, 1);
+
+ rc = mpadvise(MPA_PRC_SETBIAS, MPA_TID, pid, pCpuset);
+ if (MPA_FAILURE == rc) {
+ rc = errno;
+ OpalPrint("Error from mpadvise, %d %s, for pid %d\n", errno, strerror(errno), pid);
+ cpuset_free(pCpuset);
+ return rc;
+ }
+
+ cpuset_free(pCpuset);
+ #else
+ cpu_set_t bindSet;
+ CPU_ZERO(&bindSet);
+ CPU_SET(0, &bindSet);
+
+ /* changing process cpu affinity */
+ if (sched_setaffinity(0, sizeof(cpu_set_t), &bindSet) != 0) {
+ OpalPrint("Unable to bind the process to CPU 0. (sched_setaffinity errno %d)\n", errno);
+ return EINVAL;
+ }
+
+ #endif
+ return EOK;
+#endif /* __linux__ */
+}
diff --git a/clients/opal/models/send_receive/src/Socket.c b/clients/opal/models/send_receive/src/Socket.c
new file mode 100644
index 000000000..a5f4b7393
--- /dev/null
+++ b/clients/opal/models/send_receive/src/Socket.c
@@ -0,0 +1,223 @@
+/** Helper functions for socket
+ *
+ * Code example of an asynchronous program. This program is started
+ * by the asynchronous controller and demonstrates how to send and
+ * receive data to and from the asynchronous icons and a UDP or TCP
+ * port.
+ *
+ * @author Steffen Vogel
+ * @author Mathieu Dubé-Dallaire
+ * @copyright 2014, Institute for Automation of Complex Power Systems, EONERC
+ * @copyright 2003, OPAL-RT Technologies inc
+ * @file
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+/* Define RTLAB before including OpalPrint.h for messages to be sent
+ * to the OpalDisplay. Otherwise stdout will be used. */
+#define RTLAB
+#include "OpalPrint.h"
+#include "AsyncApi.h"
+
+#include "Config.h"
+#include "Socket.h"
+
+/* Globals variables */
+struct sockaddr_in send_ad; /* Send address */
+struct sockaddr_in recv_ad; /* Receive address */
+int sd = -1; /* socket descriptor */
+int proto = UDP_PROTOCOL;
+
+int InitSocket(Opal_GenAsyncParam_Ctrl IconCtrlStruct)
+{
+ struct ip_mreq mreq; /* Multicast group structure */
+ int socket_type;
+ int socket_proto;
+ unsigned char TTL = 1;
+ unsigned char LOOP = 0;
+ int rc;
+
+ proto = (int) IconCtrlStruct.FloatParam[0];
+ OpalPrint("%s: Version : %s\n", PROGNAME, VERSION);
+
+ switch (proto) {
+ case UDP_PROTOCOL: /* Communication using UDP/IP protocol */
+ socket_proto = IPPROTO_UDP;
+ socket_type = SOCK_DGRAM;
+ OpalPrint("%s: Protocol : UDP/IP\n", PROGNAME);
+ break;
+
+ case TCP_PROTOCOL: /* Communication using TCP/IP protocol */
+ socket_proto = IPPROTO_IP;
+ socket_type = SOCK_STREAM;
+ OpalPrint("%s: Protocol : TCP/IP\n", PROGNAME);
+ break;
+
+ default: /* Protocol is not recognized */
+ OpalPrint("%s: ERROR: Protocol (%d) not supported!\n", PROGNAME, proto);
+ return EINVAL;
+ }
+
+ OpalPrint("%s: Remote Address : %s\n", PROGNAME, IconCtrlStruct.StringParam[0]);
+ OpalPrint("%s: Remote Port : %d\n", PROGNAME, (int) IconCtrlStruct.FloatParam[1]);
+
+ /* Initialize the socket */
+ if ((sd = socket(AF_INET, socket_type, socket_proto)) < 0) {
+ OpalPrint("%s: ERROR: Could not open socket\n", PROGNAME);
+ return EIO;
+ }
+
+ /* Set the structure for the remote port and address */
+ memset(&send_ad, 0, sizeof(send_ad));
+ send_ad.sin_family = AF_INET;
+ send_ad.sin_addr.s_addr = inet_addr(IconCtrlStruct.StringParam[0]);
+ send_ad.sin_port = htons((u_short)IconCtrlStruct.FloatParam[1]);
+
+ /* Set the structure for the local port and address */
+ memset(&recv_ad, 0, sizeof(recv_ad));
+ recv_ad.sin_family = AF_INET;
+ recv_ad.sin_addr.s_addr = INADDR_ANY;
+ recv_ad.sin_port = htons((u_short)IconCtrlStruct.FloatParam[2]);
+
+ /* Bind local port and address to socket. */
+ if (bind(sd, (struct sockaddr *) &recv_ad, sizeof(struct sockaddr_in)) == -1) {
+ OpalPrint("%s: ERROR: Could not bind local port to socket\n", PROGNAME);
+ return EIO;
+ }
+ else
+ OpalPrint("%s: Local Port : %d\n", PROGNAME, (int) IconCtrlStruct.FloatParam[2]);
+
+ switch (proto) {
+ case UDP_PROTOCOL: /* Communication using UDP/IP protocol */
+ /* If sending to a multicast address */
+ if ((inet_addr(IconCtrlStruct.StringParam[0]) & inet_addr("240.0.0.0")) == inet_addr("224.0.0.0")) {
+ if (setsockopt(sd, IPPROTO_IP, IP_MULTICAST_TTL, (char *) &TTL, sizeof(TTL)) == -1) {
+ OpalPrint("%s: ERROR: Could not set TTL for multicast send (%d)\n", PROGNAME, errno);
+ return EIO;
+ }
+ if (setsockopt(sd, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&LOOP, sizeof(LOOP)) == -1) {
+ OpalPrint("%s: ERROR: Could not set loopback for multicast send (%d)\n", PROGNAME, errno);
+ return EIO;
+ }
+
+ OpalPrint("%s: Configured socket for sending to multicast address\n", PROGNAME);
+ }
+
+ /* If receiving from a multicast group, register for it. */
+ if (inet_addr(IconCtrlStruct.StringParam[1]) > 0) {
+ if ((inet_addr(IconCtrlStruct.StringParam[1]) & inet_addr("240.0.0.0")) == inet_addr("224.0.0.0")) {
+ mreq.imr_multiaddr.s_addr = inet_addr(IconCtrlStruct.StringParam[1]);
+ mreq.imr_interface.s_addr = INADDR_ANY;
+
+ /* Have the multicast socket join the multicast group */
+ if (setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mreq, sizeof(mreq)) == -1) {
+ OpalPrint("%s: ERROR: Could not join multicast group (%d)\n", PROGNAME, errno);
+ return EIO;
+ }
+
+ OpalPrint("%s: Added process to multicast group (%s)\n",
+ PROGNAME, IconCtrlStruct.StringParam[1]);
+ }
+ else {
+ OpalPrint("%s: WARNING: IP address for multicast group is not in multicast range. Ignored\n",
+ PROGNAME);
+ }
+ }
+ break;
+
+ case TCP_PROTOCOL: /* Communication using TCP/IP protocol */
+ OpalPrint("%s: Calling connect()\n", PROGNAME);
+
+ /* Connect to server to start data transmission */
+ rc = connect(sd, (struct sockaddr *) &send_ad, sizeof(send_ad));
+ if (rc < 0) {
+ OpalPrint("%s: ERROR: Call to connect() failed\n", PROGNAME);
+ return EIO;
+ }
+ break;
+ }
+
+ return EOK;
+}
+
+int SendPacket(char* DataSend, int datalength)
+{
+ int err;
+
+ if(sd < 0)
+ return -1;
+
+ /* Send the packet */
+ if (proto == TCP_PROTOCOL)
+ err = send(sd, DataSend, datalength, 0);
+ else
+ err = sendto(sd, DataSend, datalength, 0, (struct sockaddr *)&send_ad, sizeof(send_ad));
+
+ return err;
+}
+
+int RecvPacket(char* DataRecv, int datalength, double timeout)
+{
+ int len;
+ struct sockaddr_in client_ad;
+ socklen_t client_ad_size = sizeof(client_ad);
+ fd_set sd_set;
+ struct timeval tv;
+
+ if (sd < 0)
+ return -1;
+
+ /* Set the descriptor set for the select() call */
+ FD_ZERO(&sd_set);
+ FD_SET(sd, &sd_set);
+
+ /* Set the tv structure to the correct timeout value */
+ tv.tv_sec = (int) timeout;
+ tv.tv_usec = (int) ((timeout - tv.tv_sec) * 1000000);
+
+ /* Wait for a packet. We use select() to have a timeout. This is
+ * necessary when reseting the model so we don't wait indefinitely
+ * and prevent the process from exiting and freeing the port for
+ * a future instance (model load). */
+ switch (select(sd+1, &sd_set, (fd_set *) 0, (fd_set *) 0, &tv)) {
+ case -1: /* Error */
+ return -1;
+ case 0: /* We hit the timeout */
+ return 0;
+ default:
+ if (!(FD_ISSET(sd, &sd_set))) {
+ /* We received something, but it's not on "sd". Since sd is the only
+ * descriptor in the set... */
+ OpalPrint("%s: RecvPacket: God, is that You trying to reach me?\n", PROGNAME);
+ return -1;
+ }
+ }
+
+ /* Clear the DataRecv array (in case we receive an incomplete packet) */
+ memset(DataRecv, 0, datalength);
+
+ /* Perform the reception */
+ if (proto == TCP_PROTOCOL)
+ len = recv(sd, DataRecv, datalength, 0);
+ else
+ len = recvfrom(sd, DataRecv, datalength, 0, (struct sockaddr *) &client_ad, &client_ad_size);
+
+ return len;
+}
+
+int CloseSocket(Opal_GenAsyncParam_Ctrl IconCtrlStruct)
+{
+ if (sd < 0) {
+ shutdown(sd, SHUT_RDWR);
+ close(sd);
+ }
+
+ return 0;
+}
diff --git a/clients/opal/s2ss_tests.llp b/clients/opal/s2ss_tests.llp
new file mode 100644
index 000000000..faf3ee696
--- /dev/null
+++ b/clients/opal/s2ss_tests.llp
@@ -0,0 +1,18 @@
+
+
+
+ s2ss_tests
+ This is a project!
+ ON
+ D:\msv\svo\opal\s2ss_tests\s2ss_tests.llp
+
+
+
+
+ models\send_receive\send_receive.mdl
+ D:\msv\svo\opal\s2ss_tests\models\send_receive\send_receive.mdl
+ D:\msv\svo\opal\s2ss_tests\models\send_receive\send_receive.mdl
+
+
+
+