Project#TwinCAT x SIMIT PROFIdrive1 Simulation

この記事ではTwinCATとSIMITをどう連携しProfiDrive1をシミュレーションするかを説明します。基本的にPROFINETやPROFIBUS通信でPROFIDRIVEを使用するのですが。

Profinet SupportするPLC>Telegram1を構築>Drive通信するのは現実世界の話ですが、今回はあえてTwinCATとOPCUAに置き換え、G120はSIMIT側に任せました。

なぜかというか、ProfiDrive1は実際通信してるのは4Bytesのデータなので、そこまでSimulation上でOPCUAやProfinetやなんでもよいので、プログラム作り終わった最後にProfinetに合わせて変更すればよいではないか?と思っています。

あとは私はライセンスとPN Simulation Modulesがないのも大きな原因です…

Tutorialはちょっと長い目になりますが、よろしくお願いしますね。

Reference Link

Siemens

シーメンス#StarterでDriveを試運転する
シーメンス#SINA_SPEEDを使ってDriveを制御する
Siemens#SIMIT Installation

TwinCAT

Beckhoff#TwinCAT3 TF6100 OPCUA _Part2_OPCUA Client IO使おう

PROFIdrive?

ProfiDriveはPROFINETとPROFIBUSの標準なDrive Interfaceで、速度制御からHigh LevelのServo制御も使用されています。

ProfiDriveにPZD(Prozessdaten) つまり現在状態とSTW – control words [DE

Steuerwort] 制御コマンドに分かれています。

Telegramの種類によりPZDとSTWの数も違います。

In Telegram1…

STW1/STW2 と ZSW1/ZSW2 はTelegram1で使用されています。

STW1:Control Word,OnするBitによりDriveの状態が変わる

STW2:Speed 指令値

ZSW1:Status word、Driveの現在状態を示しています。

ZSW2:Speed現在値

Componet

このTutorialでは使用する部品だけを紹介します。

PROFIdrive1

PROFIdrive1 はSiemensのProfidrive Telegram1をシミュレーションします。

NSOLL_A=Speed指令値

NIST_A =現在Speed

注意するのはNOSLL_A と NIST_A は0−16384でYは0−100%のSpeed Setpointで100%=16384になります。

STW1/ZSW1をBlockをクリックすると一覧できます。

ZSW1.3とZSW1.7のFault/Warning Bitは強制的にTure/Falseできます。

Connectors-Inputs

NameDescription
STW1PROFIdriveのControl word1
NSOLL_ASpeed指令値、0-16384 
NIstProcess value Actual speed

Connectors-Outputs

NameDescription
ZSW1PROFIdriveのStatus word1 
NIST_ASpeed現在値 0-16384 
YProcess speed setpoint from 0-100%
NSollProcess value Speed setpoint

Universal 

この部品はProfiDriveの拡張です。ZSW1とSTW1のBit11から15までを構成できます。

PROFIdrive1/PROFIdrive2と一緒に使用することできます。

. 

Connectors

NameDescription
ZSW1.11-15ZSW1.11-15 signals の割付け.
NSOLL_ARaw speed setpoint 0-16384 
NIstProcess value Actual speed

Motor

この部品はMotorをシミュレーションすることができ、スイッチONとスイッチOFFのBinary Inputなどが用意されています。

Drive ONもしStart=True。

Drive OffもしStart=False。

Connectors-Inputs

NameDescription
P_Start立ち上げ=DriveON
P_Stop立ち上げ=DriveOFF
StartDrive Switch On if Signal =1
T_UpRamp up time
T_DonwnRamp Down time
LocalActLocal Key operation Active
LockActLocal Key Operation Lock
SetpointMotor 速度 0~100%

Connectors-Outputs

NameDescription
Fbk_Run1=Speed到達
Fbk_Off1=Speed到達してない
LocalDrive Switch On if Signal =1
StartLocal1=Local 
StopLocal1=Not Local
LocalActLocal Condition
Maint1=in Maintanece
Trip1=in Trip
YDrive 現在速度0~100%

State machine

こちらはPROFIdriveのFlowです。


SIMIT Side

では、SIMIT SoftwareからSimunlationを作成しましょう。

Coupling

今回のTutorialではOPCUAを使用し、SIMIT側はOPCUA Serverとして働き、TwinCATはOPCUA Clientの役割でデータをやりとりします。

Your Project>Couplings>Create OPC UA Serverで新しいCouplingsを作成します。

PROFIdrive1のTelegramを定義します。

TypeはIntegerです。

Create new chart

SimitのSimunlation ProcessはCharts内で動きます。

Charts>New chartで新規Chartを作成しましょう。

デモバージョンを使用してるので、このWarning Messageが常に出ています。

Basic Simulation of Profidrive1

Insert PROFIDRIVE

Components>Drives>PROFIdrive,PROFIdrive1を選びます。

PROFIdrive1の部品をChartに追加します。

よし、PROFIdrive1 Simulation Blockが追加されましたね。

Hide/Show Interface

使われていないInterfaceはSimunlation Blockで非表示することができ、あなたのChartの可視性が上がります。Simunlation Blockをクリックし>目ICONがありますので、そのICONをクリックすれば該当するInterfaceを表示・非表示することができます。

その通り、いまSTW1が非表示になりました。

Parameter

Reference Speed と Maxspeed はDriveをSimunlationするとき大事なパラメータです。

Reference Speed は16#16384のときのDrive回転数です。

Insert Sinamics

次は Basic components>Siemens でSinamicsを選びます。

Sinamics objectをChartに追加します。

このように、PROFIdrive1 Simulation BlockはSinamics Blockとグループ化できます。


Insert Universal

Basic components>PROFIdriveでUniversalを選びます。

そのUniversal BlockをSinamicsの下にDropします。

よし、これで完成。

Mapping the Connector

PROFIdriveのSimulation が構成完了したら次はSignal Mappingです。

Insert Output Connector

Components>CONNECTORS でOutputを選びます。

.

OutputをChartに追加します。

このようですね!

ここでみなさんが混乱するかもしれませんが、前のTutorialも書いてたように、SIMIT上でINPUTとOUTPUTの表現は逆で受け側からの視点になります。

つまり、OUTPUTはSIMITのINPUTで、INPUTはSIMITのOUTPUTのだと。

でも、SIMITソフト上でも信号を間違えないように色分けしています。

”Output”信号は緑で同じSignalと接続しかできません。

Insert Input Connector

次はInput Connectorsを追加します。

このようですね。

Input Connector が追加されました。

Link the Signal-Method1

Connectorは単なるConnectorのままで、実際の信号と接続する必要があります。接続方法は2つあります。まず右のTabでSignal tabをクリックします。

すべての信号もここで一覧できます。

今回は自分が定義したOPC Server Nodeと接続したいので、OPCをSource field入力します。

信号をそのままProperty>Sigual>Value FieldにDropします。

簡単明快。

Link the Signal-Method2

次は方法2を紹介します。信号をそのままShift+Dropで直接追加します。

Link the signal to Block

信号が追加されたら、その信号をBlockと接続します。

以下のGIFのような操作です。

おめでとうございます!信号はほぼMappingされました。

Spilt the Blocks

Simulation のLogicが複雑になるとChartがぐちゃぐちゃになります。

Framesなどを追加しLogicを分けることをおすすめします。

Add Rectangle

右側のGraphic Tab を開きます。

Rectangle objectを選びます。

そのObjectをSheetに追加します。

RectangleがChartに追加されました。

RectangleをクリックするとPropertyのTabが開き、Rectangleの設定を変更できます。

まずColorをFill-colorからno colorに変更します。

そしてRectangleのサイズを変更し、他のSimulation Blockと分けておきましょう。

Add Text

次はテキストを追加し、Simulation Blockに簡単な説明を書きます。

Text ObjectをSheetにDropします。

そしてTextに説明文を入力します。

Text ObjectのBackground colorを変更できます。

いまはわかりやすくなりましたね。

Testing

では、まずPROFIdrive1のBlockをテストしてみます。

あなたがBlockを右クリックするとSTW/ZSWを一覧できます。

“-”というボタンがあり、クリックすると現在値を強制変更できます。

たとえばSTW1に1234w強制的に書き込みます。

1234=010011010010

Motor Simulation

Insert Motor

次はMotor側ですね。

Drives>MotorでMotorを選びます。

Motor ObjectをChartに追加します。

Motor Simulation Blockが追加されました。

Function test

まずMotor Blockをテストしてみます。

Add Push Button

ボタンを追加します。右側のControls tabをクリックします。

Controls>InputでPushbuttonを選びます。

PushbuttonをChartに追加します。

あまりボタンっぽくないですが、その小さな四角はボタンです。

押すとTrueになり、リリースするとFalseになります。

Edit-Show names

Buttonの名前を表示します。そうするとButtonの役割がわかります。

Buttonを選び>General>Show namesのCheckboxをCheck入れます。

文字がButtonの上に表示されますね。

Edit-Name

もちろん、その文字は修正できます。

General>Nameでわかりやすい名前に変更しましょう。

いまはMotor_PStart と Motor_PStop、2つのButtonが出てきました。

Add Slider

私は3つのスライダーを追加しRamp up/down/Speed setpoint設定できるようにします。Controls>InputでスライダーをChartに追加します。

スライダーが追加されました。

Edit-Start/End Value

Start/EndのFieldでスライダーの入力・出力のリミットを設定します。

Edit-Increment

Incrementは一回スライドする際の加算値を設定します。

Edit-Default Value

Simulation起動するときのDefault値はここで設定できます。


Add Digital display

最後にDigital displayを追加しBlockの出力をMonitorできるようにします。

Controls>DisplayでDigital displayをChartに追加します。

Digital displayが追加されました。

Linking

追加された部品をMotor Blockと接続します。

Testing

以下のように、MotorはP_StartがTrueになるとSetpoint値Outputされます。

Add Mode

今回のTutorialはSIMITとTwinCATの連携ですね。なので2つModeを定義します。

Manual=SIMITのLocal Operation

Auto=TwinCATからのRemote Control

Manual ModeはスイッチONするときTriggerし、OFFするときはAuto Modeになる。

Add Connector

Basic Components>Connectorで2つ追加します。

ConnectorはProperty内ではNameだけです。実際そのNameは”変数名”です。

例えばいまConnector#1という名前のConnectorが設定されます。そのConnector#1に他のLogicで現在値を上書きされたら他のLogicにも使います。

よし、変数も追加OKです。

Add AND Gate

Connectors>STANDARD>BinaryBasicでAND Objectを追加します。

Add NOT Gate

次はNOT gateです。

Add Switch

最後にスイッチを追加します。

Controls Tabを開きます。

Controls>InputでSwitchを追加します。

Create Mode Change Flow

こちらはMode ControlのFlowです。

Add Push Button interlock

 P_Start と P_StopのTrigger条件にManual ModeのAND Logicを入れます。

その P_Start と P_StopManual Modeのみになります。

Testing

下図のようにMotorはManaul modeのみ動作します。


Add  AutoStart signal

よし、次はTwinCATからSTW1.0を受信したときのStart信号をMotor SimulationのStart信号として使用します。STW1.0のBitデバイスなのでDWORDからByte変換し次はBitに変換する必要があります。

Add DWord2Byte

DWord2Byte をChartに追加します。

DWがDouble Word Inputで4 Bytesに変換します。


Add Byte2Bit

次はByte2BitをChartに追加します。

BはByte inputで8Bitを分解してくれます。

Add Control Flow

STW1をDWord2ByteのDWのINPUTとして入力し分解された4ByteのB0だけをByte2BitのB Inputとしていれます。最後は0 OutputをAND Gate と接続し、Motor BlockのStart 信号と繋がります。

Add new Chart

Logicが複雑になり、Chartはまた見辛くなりましたね。今度はLogicでChartを分けます。

Charts>New chartします。

Mode 操作 と手動のStart/Stop/Setpoint は全部新しいChartに移動します。

Add Auto Start Signal again

自動Start信号も新しいChartに追加します。

もちろんそのAutoStart信号をMotor Simulation BlockのStart パラメタと接続してください。


Add Auto setpoint

Auto setpointを作成しTwinCATから速度設定値を受けとります。

The Profiedrive1_NSoll connector という変数を追加し、 NSoll outputに割り付けます。

Analog Selectorを使ってManual ModeとAuto Modeを使い分けます。

0=Manual Setpoint使用。

1=TwinCATのSpeed Command使用。

MotorSetpoint変数もMotor Simulation BlockのSetpointパラメータに割り付けましょう。

Add Feedback to Profidrive block

Feedback速度もシミュレーションし、 “ramp up/down” functionを模擬します。その “ramp up/down”の速度はMotor Simulation Blockで制御します。

Profidrive1_NSoll iはSimulation Blockから受け取た速度コマンドで0-100%にスケールします。もちろん現在の速度も0-Reference speedにスケールします。

Profidrive1_NlstをPROFIdrive1のNistと繋がります。

Flow

ここまできてお疲れ様です。

Profidrive1_SimはDriveのMain Simulationです。

System chartはModeの切り替え・Start/Stop・Speed SetpointのLogicが入っています。

TwinCAT Side

Configure OPC-UA Client

Beckhoff#TwinCAT3 TF6100 OPCUA _Part2_OPCUA Client IO使おう

Function Block – FB_ProfiDrvie1

これはProfiDrive1制御のメインFunction Blockです。

OPCUA Clientの通信が使われていますが、Profinetを使用するときに4 Wordsに変更すればよいです。

VAR_INPUT

VAR_INPUT

iRefHMI :REFERENCE TO DUT_ProfiDrive1_HMI;
ir32AutoSpeedCmd :REAL;
ibReset :BOOL;
iMode :DUT_Mode;
END_VAR
NameTypeDescription
iRefHMIREFERENCE TO DUT_ProfiDrive1_HMIHMI Interface 
ir32AutoSpeedCmdREALAuto ModeのSetpoint
ibResetBOOL1=エラーリセット
iModeDUT_Mode現在ModeAuto/Manual

VAR

STW1,NSOLL_A,ZTW1,NIST_A はProcessI/Oとして定義し、ProfiDriveのInterfaceに割り付けてください。

VAR
STW1 AT %Q* :uDUT_STW;
NSOLL_A AT %Q* :LINT;
ZTW1 AT %I* :uDUT_ZSW;
NIST_A AT %I* :LINT;
OPCUA_Client :DUT_OPCUA_Client;
RefIsVaild :BOOL;
r32RefSpeed :REAL;
w16Fault :WORD;
w16Warning :WORD;
TON :TON;
END_VAR

PROGRAM

こちらはFunction Block内のプログラムです。

Here is the program inside the Function block.

  1. OPC-UA 接続を初期化します。
  2. Hmi Referenceは正しいかCheck
  3. Drive 有効
  4. Reset 
  5. Fault 検知
//
OPCUA_Init();

//
CheckRef();
//
TON(IN:=OPCUA_Client.Status.Connected AND NOT fault,PT:=T#1S);
Enable(mbEnable:=TON.Q);

//
Reset(mbReste:=ibReset);
//Fault
Fault00_FromDrive();
Fault01_RefSpeedErr();

//Warning
Warning00_FromDrive();


Method

CheckRef

TwinCATのRuntimeは無効のreferenceを渡すと止まることになりますので、__ISVAILDREF() 関数でreferenceが正しいかどうかをCheckします。

METHOD CheckRef : BOOL

RefIsVaild:=__ISVALIDREF(iRefHMI);

Enable

HMIからのEnable信号です。

METHOD Enable : BOOL
VAR_INPUT
mbEnable:BOOL;
END_VAR

IF mbEnable AND RefIsVaild THEN
STW1.stSTW.b00Off1:=iRefHMI.PB.bOFF1;
END_IF;

Fault00_FromDrive 

Fault00はProfiDrive からのエラー信号です。

METHOD Fault00_FromDrive : BOOL

IF ZTW1.stZSW.b03FaultActive THEN
w16Fault.0:=TRUE;
END_IF

Fault01_RefSpeedErr 

Fault01はReference speedが<=0のとき発生します。

METHOD Fault01_RefSpeedErr : BOOL

IF RefSpeed <=0.0 THEN
w16Fault.1:=TRUE;
END_IF

FB_Init

ProfiDrive のDefault構成を設定します。

METHOD FB_init : BOOL
VAR_INPUT
(* if TRUE, the retain variables are initialized (warm start / cold start)*)
bInitRetains : BOOL;
(* if TRUE, the instance afterwards gets moved into the copy code (online change)*)
bInCopyCode : BOOL;
END_VAR


STW1.stSTW.b01Off2:=TRUE;
STW1.stSTW.b02Off3:=TRUE;
STW1.stSTW.b03EnableOperation:=TRUE;
STW1.stSTW.b04DisableRFG:=TRUE;
STW1.stSTW.b05EnableRFG:=TRUE;
Stw1.stSTW.b06EnableSetpoint:=TRUE;
Stw1.stSTW.b10ControlByPLC:=TRUE;

Hmi

HMIに表示情報を転送します。

METHOD Hmi : BOOL

IF RefIsVaild THEN
iRefHMI.PL.i64RawDataZTW:=ZTW1.stZSW;
iRefHMI.PL.i64RawDataSTW:=STW1.stSTW;
iRefHMI.PL.i64RawData_NIST_A:=NIST_A;
iRefHMI.PL.i64RawData_NSOLL_A:=NSOLL_A;
iRefHMI.PL.bFault:=Fault;
iRefHMI.PL.bWarning:=Warning;
iRefHMI.PL.bReady:=Ready;
iRefHMI.PL.r32ActualSpeed:=RawSpeed2Real(raw:=NIST_A);

iRefHMI.PL.OPCUAControl:=OPCUA_Client.Control;
iRefHMI.PL.OPCUAStatus:=OPCUA_Client.Status;


END_IF

OPCUA_Init

Write-EnableはTwinCATとOPCUA ServerとつながってるのみTrueになります。

METHOD OPCUA_Init : BOOL

IF OPCUA_Client.Status.Connected THEN
OPCUA_Client.Control.Write_Enable:=TRUE;
ELSE
OPCUA_Client.Control.Write_Enable:=FALSE;
END_IF

r32Speed2Raw 

Speedを0-100% から0-16384.0に変換するMethodです。

METHOD r32Speed2Raw : LINT

VAR_INPUT
mr32Setpoint:REAL;
END_VAR


r32Speed2Raw:=

REAL_TO_LINT(

(mr32Setpoint/100.0)*16384.0)
;

RawSpeed2Real 

Speedを0-16384. to 0-100%に変換するMethodです。

METHOD RawSpeed2Real : REAL
VAR_INPUT
raw:LINT;
END_VAR


RawSpeed2Real:= (LINT_TO_REAL
(raw)/16384.0)
*100.0;

Reset 

エラーをリセットする。

METHOD Reset : BOOL
VAR_INPUT
mbReste:BOOL;
END_VAR

STW1.stSTW.b07Ack:=mbReste
OR (RefIsVaild AND iRefHMI.PB.bReset)
;
w16Fault:=0;
w16Warning:=0;

Run

いまDriveの状態でSpeed Setpointを書き込みしています。

METHOD Run : BOOL

IF NOT Ready THEN
NSOLL_A:=0;
END_IF;

IF Ready THEN
IF RefIsVaild AND iMode = DUT_Mode.Manual THEN
NSOLL_A:=r32Speed2Raw(mr32Setpoint:=iRefHMI.PB.r32SpeedSetPoint);
ELSIF iMode= DUT_Mode.Auto THEN
NSOLL_A:=r32Speed2Raw(mr32Setpoint:=ir32AutoSpeedCmd);
END_IF;
END_IF

Stop 

Speed set-pointを0に書き込みます。

METHOD Stop : BOOL

NSOLL_A:=0;

Warning00_FromDrive 

DriveからのWarningを検知します。

METHOD Warning00_FromDrive : BOOL

IF ZTW1.stZSW.b07AlarmActive THEN
w16Warning.0:=TRUE;
END_IF

Proprety

ActSpeed

現在SpeedをReturnします。

PROPERTY ActSpeed : REAL

CmdSpeed 

コマンドSpeedをReturnします。

PROPERTY CmdSpeed : REAL

Fault

Function BlockのFaultをReturnします。1=Faultあり。

PROPERTY Fault : BOOL

Ready

Ready状態をReturnします。1=Ready中。

PROPERTY Ready : BOOL

RefSpeed

Reference speedを設定します。SIMITと合わせて設定してください。

PROPERTY RefSpeed : REAL

Warning

Function BlockのWarningをReturnします。1=Warningあり。

PROPERTY Warning : BOOL


DUT

DUT_Mode

{attribute ‘qualified_only’}
{attribute ‘strict’}
TYPE DUT_Mode :
(
enum_member := 0
,Auto:=1
,Manual:=10
);
END_TYPE

DUT_STW

STWのBit Mappingです。TutorialのReference Linkを参考にしてください。

TYPE DUT_STW :
STRUCT
b00Off1 :BIT;
b01Off2 :BIT;
b02Off3 :BIT;
b03EnableOperation :BIT;
b04DisableRFG :BIT;
b05EnableRFG :BIT;
b06EnableSetpoint :BIT;
b07Ack :BIT;
b08Spare :BIT;
b09Spare :BIT;
b10ControlByPLC :BIT;
b11Direction :BIT;
b12 :BIT;
b13 :BIT;
b14 :BIT;
b15 :BIT;
_noused :ARRAY[0..2]OF INT;
END_STRUCT
END_TYPE

uDUT_STW 

union data typeでSTWとLINTを一つの変数としてまとめます。

TYPE uDUT_STW :
UNION
STW:LINT;
stSTW:DUT_STW;
END_UNION
END_TYPE

DUT_ZSW

ZSW1のBit Mappingです。TutorialのReference Linkを参考にしてください。

TYPE DUT_ZSW :
STRUCT
b00Ready2SStart :BIT;
b01Ready :BIT;
b02OperationEnable :BIT;
b03FaultActive :BIT;
b04Off2InActive :BIT;
b05Off3InActive :BIT;
b06LockOut :BIT;
b07AlarmActive :BIT;
b08SpeedDeviation :BIT;
b09MasterControlRequested :BIT;
b10SpeedReached :BIT;
b11 :BIT; //manufactor-define
b12 :BIT; //manufactor-define
b13 :BIT; //manufactor-define
b14 :BIT; //manufactor-define
b15 :BIT; //manufactor-define
_noused :ARRAY[0..2]OF INT;
END_STRUCT
END_TYPE


uDIT_ZSW

union data typeでZSWとLINTを一つの変数としてまとめます。

TYPE uDUT_ZSW :
UNION
ZSW:LINT;
stZSW:DUT_ZSW;
END_UNION
END_TYPE

DUT_ProfiDrive1_HMI_PB

HMIのコマンドです。

TYPE DUT_ProfiDrive1_HMI_PB :
STRUCT
bOFF1:BOOL;
r32SpeedSetPoint:REAL;

bDriveON:BOOL;
bDriveOFF:BOOL;
bReset:BOOL;
END_STRUCT
END_TYPE

DUT_ProfiDrive1_HMI_PL

HMIの表示です。

TYPE DUT_ProfiDrive1_HMI_PL :
STRUCT
bFault :BOOL;
bWarning :BOOL;
bReady :BOOL;
i64RawDataSTW :DUT_STW;
i64RawData_NSOLL_A :LINT;
i64RawDataZTW :DUT_ZSW;
i64RawData_NIST_A :LINT;
r32ActualSpeed :REAL;
OPCUAStatus :OpcUaDeviceStatus;
OPCUAControl :OpcUaDeviceControl;
END_STRUCT
END_TYPE

DUT_ProfiDrive1_HMI

ProfiDrive1のHMI操作Groupです。

TYPE DUT_ProfiDrive1_HMI :
STRUCT
PB:DUT_ProfiDrive1_HMI_PB;
PL:DUT_ProfiDrive1_HMI_PL;
END_STRUCT
END_TYPE

DUT_OPCUA_Client 

OPCUA ClientのStatusとControlデバイスです。

TYPE DUT_OPCUA_Client :
STRUCT
Status AT %I*:OpcUaDeviceStatus;
Control AT %Q*:OpcUaDeviceControl;
END_STRUCT
END_TYPE

HMI

こちらはHMIです。

TabでDriveやOPCUAの状態が見えます。

こちらのTabにはZSWが表示されます。

Tab3ではOPCUA Clientの状態を表示しています。

MAIN

VAR

PROGRAM MAIN
VAR
Drive1 :FB_ProfiDrvie1;
Drive1Hmis :DUT_ProfiDrive1_HMI;
bEnable :BOOL;
r32ActSpeed :REAL;
r32CmdSpeed :REAL;
hmiMode :DUT_Mode;
END_VAR

PROGRAM

Drive1.RefSpeed:=3000.0;
Drive1(
iRefHMI:=Drive1Hmis
,iMode:=hmiMode
);

r32ActSpeed:=Drive1.ActSpeed;
Drive1.Run();
Drive1.Hmi();


Result

Source Code Download

https://github.com/soup01Threes/TwinCAT3/blob/main/TwinCAT%20Project_withSIMIT_Prodrive1.zip

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする