---
lang: zh-tw
---
TwinCAT 電子凸輪手冊
===
## 簡介
本文件實現TwinCAT電子凸輪使用配置與操作方法。
<i class="fa fa-pencil fa-fw"></i> 作者:林建安 10973110@gm.nfu.edu.tw
---
## 目錄
[TOC]
---
## 系統環境配置
### Mircrosoft Visual Studio 安裝
- 安裝版本: Visual Studio Professional 2015
- 軟體金鑰: HMGNV-WCYXV-X7G9W-YCX63-B98R2
- [安裝檔下載](https://drive.google.com/file/d/1yaLBa0s1NXx-FeFxjTw8GUOFfxjZ3HVb/view?usp=sharing)
- [安裝過程參考資料](https://www.itread01.com/content/1541589849.html)
### Beckhoff TwinCAT 安裝
- 安裝版本: v3.1 4024.4
- [安裝檔下載](https://drive.google.com/file/d/1f73-0XfsjnV4AqDWOLb0BhdQbwRJ70Oq/view?usp=sharing)
- [官方安裝教學](https://infosys.beckhoff.com/english.php?content=../content/1033/tc3_installation/447485323.html&id=)
## 建置TwinCAT專案
1. 打開 ==TwinCAT XAE Shell==,並點擊==New TwinCAT Project==創建專案。

- 載入EtherCAT設備
1. 為您的網路介面卡設備安裝TwinCAT驅動程式,點擊上方導航列==TwinCAT > Show Reaktime Ethernet Compatiable Devices==

2. 點擊==Compatiable devices(表示支援TwinCAT功能)== 下方的網卡,再點擊==Install==進行安裝,安裝完即可關閉視窗。

2. 展開左方選單 ==I/O== ,右鍵點擊==Device==下內==Scan==進行設備掃描

3. 勾選已連結設備,並按ok

> 此處EtherCAT設備為馬達驅動器
4. 此時會跳出 ==Scan for boxes== ,點選是

> 此動作是偵測該EtherCAT裝置下連接的設備(如:馬達)
5. 搜尋到馬達後,選擇馬達類型,選擇NC並按OK

:::info
:bulb: **提示**: Active Free Run一律選擇否。
:::
6. 此時可見左方選單已完成馬達與驅動器相關配置。

---
## 建置PLC專案
1. 右鍵點擊左方選單==PLC==,選擇==Add New Item==

2. 選擇==Standard PLC Project==,並點擊==Add==

3. 新增完畢後,可於左方看見PLC專案樹狀清單

:::info
小提示 :mega:
- References: PLC專案所載入的函示庫
- DUTs: 結構、Enum定義
- GVLs: 全域變數定義
- POUs: PLC程式碼定義
:::
### 載入所需PLC函示庫
1. 右鍵點擊左方選單==References==,選擇==Add Library==

2. 搜尋==MC2==,並依序新增==Tc2_MC2==以及==Tc2_MC2_Camming==

使用電子凸輪功能
===
## 方法1-使用PLC程式使用電子凸輪
### 配置電子凸輪主從軸
#### 新增主軸與從軸的變數
1. 點擊左方==PLC > CamExample > CamExample Project > POUs > MAIN(PRG)==,並在新增下方程式碼
```typescript=
master,slave: AXIS_REF;
```

2. 點擊上方工具列==Activate Configuration==

3. 並點擊OK

4. 是否啟動Run模式,點擊取消,此處只為了將變數更新

#### 配置從軸
1. 雙擊==Motion > NC-Task 1 SAF > Axes > Axis 1==,切至==General==分頁,並將馬達名稱改為==slave==,此馬達為實際透過Ethernet連接的馬達

2. 切至==Setting==分頁,依序點選==Link To PLC==,馬達軸選擇==MAIN.slave==,並按OK

:::info
:bulb: **提示**: 此處若無出現變數可以選取,請確認新增全域變數後是否有執行Activate Configuration
:::
#### 新增主軸
1. 右鍵點擊==Axes==,並選擇==Add New Item==

2. 名稱取為==master==,並按OK

3. 切至==Setting==分頁,依序點選==Link To PLC==,馬達軸選擇==MAIN.master==,並按OK

### 新增電子凸輪程式
#### 新增凸輪狀態宣告
1. 右鍵點擊==DUTs==,選取==Add==選單下的==DUTs==

2. 名稱==camming_state==,Type選取==Enumeration==,並按下Open,此宣告用來判斷凸輪狀態

3. 並將下方程式碼貼於右方程式編輯區
```typescript=
TYPE camming_state :
(
state_init,
state_power,
state_forward,
state_pre_table1,
state_camming1,
camming_status,
state_error,
state_reset
)INT;
END_TYPE
```

#### 新增凸輪功能模組輸出接口變數
點擊左方==PLC > CamExample > CamExample Project > POUs > MAIN(PRG)==,並在新增下方程式碼
```typescript=
camming_state: camming_state;
CamInOut, CamOutOut, CamTableSelectOut, MoveMasterOut, MoveSlaveOut, ResetMasterOut, ResetSlaveOut: ST_McOutputs; {*用於綁定模組輸出接口*}
```
完成後如下圖所示,並按下==Ctrl+S==儲存

#### 新增 [MC_CamIn](https://infosys.beckhoff.com/english.php?content=../content/1033/tcplclibmc2_camming/460403723.html&id=)
1. 右鍵點擊==POUs==選單下的==MAIN(PRG)==,選取==Add==選單下的==Action==

2. 名稱==camming==,Language選取==FBD==,並按下==OPEN==

3. 右鍵點擊程式編輯區,選擇==Insert Box==

4. 選取==Tc2_MC2_Camming->POUs->General->MC_CamIn==,並按下OK

並將圖塊名稱更改為==CamIn==後,跳出自動宣告視窗,並點擊ok,如下圖所示。

5. 依下圖完成==CamIn==方塊輸出與輸入定義

#### 新增 [MC_CamTableSelect](https://infosys.beckhoff.com/english.php?content=../content/1033/tf5050_tc3_nc_camming/1002328715.html&id=)
0. 於空白處按右鍵,並點擊==Insert network==新增空白格子

1. 右鍵點擊程式編輯區,選擇==Insert Box==

2. 選取==Tc2_MC2_Camming->POUs->General->MC_CamTableSelect==,並按下OK

並將圖塊名稱更改為==CamTableSelect==,並跳出自動宣告視窗,如下圖所示。


3. 依下圖完成==CamTableSelect==方塊輸出與輸入定義

#### 新增 [MC_CamOut](https://infosys.beckhoff.com/english.php?content=../content/1033/tf5050_tc3_nc_camming/1002381451.html&id=)
0. 於空白處按右鍵,並點擊==Insert network==新增空白格子

1. 右鍵點擊程式編輯區,選擇==Insert Box==

2. 選取==Tc2_MC2_Camming->POUs->General->MC_CamOut==,並按下OK

並將圖塊名稱更改為==CamOut==,並跳出自動宣告視窗,如下圖所示。


3. 依下圖完成==CamOut==方塊輸出與輸入定義

### 新增馬達運動函式
#### MC_MoveAbsolute
1. 右鍵點擊==POUs==選單下的==MAIN(PRG)==,選取==Add==選單下的==Action==

2. 名稱==move_m_s==,Language選取==FBD==,並按下==OPEN==

3. 右鍵點擊程式編輯區,選擇==Insert Box==

4. 選取==Tc2_MC2->POUs->Motion->Point To PointMotion ->MC_MoveAbsolute==,並按下OK

並將圖塊名稱更改為==MoveAbsoluteSlave==,並跳出自動宣告,如下圖所示。

5. 依下圖完成==MoveAbsoluteSlave==方塊輸出與輸入定義

#### MC_MoveVelocity
0. 於空白處按右鍵,並點擊==Insert network==新增空白格子

1. 右鍵點擊程式編輯區,選擇==Insert Box==

2. 選取==Tc2_MC2->POUs->Motion->MC_MoveVelocity==,並按下OK

並將圖塊名稱更改為==MoveVelocityMaster==,並跳出自動宣告視窗,如下圖所示。


3. 依下圖完成==MoveVelocityMaster==方塊輸出與輸入定義

---
### 新增馬達啟動函式
0. 點擊==POUs==選單下的==MAIN(PRG)==,定義==MC_POWER==變數功能,如下圖所示
```typescript=
MC_Power: MC_Power;
```

1. 右鍵點擊==POUs==選單下的==MAIN(PRG)==,選取==Add==選單下的==Action==

2. 名稱==power==,Language選取==ST==,並按下==OPEN==

3. 複製下方程式碼貼於程式編輯區
```typescript=
MC_Power(Axis:= master, Enable:= TRUE, Enable_Positive:= TRUE, Enable_Negative:= TRUE, Override:= 100);
MC_Power(Axis:= slave, Enable:= TRUE, Enable_Positive:= TRUE, Enable_Negative:= TRUE, Override:= 100);
```

---
### 新增馬達重置函式
#### MC_Reset(Slave)
1. 右鍵點擊==POUs==選單下的==MAIN(PRG)==,選取==Add==選單下的==Action==

2. 名稱==reset==,Language選取==FBD==,並按下==OPEN==

3. 右鍵點擊程式編輯區,選擇==Insert Box==

4. 選取==Tc2_MC2->POUs->Administrative->Axis Functions->MC_Reset==,並按下OK

並將圖塊名稱更改為==ResetSlave==,並跳出自動宣告視窗,如下圖所示。


5. 依下圖完成==ResetSlave==方塊輸出與輸入定義

---
#### MC_Reset(Master)
0. 於空白處按右鍵,並點擊==Insert network==新增空白格子

1. 右鍵點擊程式編輯區,選擇==Insert Box==

2. 選取==Tc2_MC2->POUs->Administrative->Axis Functions->MC_Reset==,並按下OK

並將圖塊名稱更改為==ResetMaster==,並跳出自動宣告視窗,如下圖所示。

3. 依下圖完成==ResetMaster==方塊輸出與輸入定義

---
### 新增電子凸輪表
0. 於主程式內定義凸輪表參數,點擊==MAIN(PRG)==並新增下列程式碼至變數宣告區,按下==Ctrl+S==存檔,完成後如圖所示。
```typescript=
Table: ARRAY[1..4] OF MC_MotionFunctionPoint;
```

1. 右鍵點擊==POUs==選單下的==MAIN(PRG)==,選取==Add==選單下的==Action==

2. 名稱==table_point==,Language選取==ST==,並按下==OPEN==

3. 複製下方程式碼貼於程式編輯區
```typescript=
CamTable.ArraySize:=SIZEOF(Table);
CamTable.NoOfColumns:=1;
CamTable.NoOfRows:=4;
CamTable.pArray:=ADR(Table);
CamTable.TableType:=MC_TABLETYPE_MOTIONFUNCTION;
(*Link Mode*)
Table[1].FunctionType:=MOTIONFUNCTYPE_POLYNOM7_MM;
Table[1].MasterPos:=0;
Table[1].SlavePos:=250;
Table[1].PointIndex:=1;
Table[1].PointType:=MOTIONPOINTTYPE_TURN;
Table[2].FunctionType:=MOTIONFUNCTYPE_POLYNOM5;
Table[2].MasterPos:=135;
Table[2].SlavePos:=24;
Table[2].PointIndex:=2;
Table[2].PointType:=MOTIONPOINTTYPE_REST;
Table[3].FunctionType:=MOTIONFUNCTYPE_POLYNOM7_MM;
Table[3].MasterPos:=225;
Table[3].SlavePos:=0;
Table[3].PointIndex:=3;
Table[3].PointType:=MOTIONPOINTTYPE_REST;
Table[4].FunctionType:=MOTIONFUNCTYPE_POLYNOM7_MM;
Table[4].MasterPos:=360;
Table[4].SlavePos:=250;
Table[4].PointIndex:=4;
Table[4].PointType:=MOTIONPOINTTYPE_TURN;
```
### 新增PLC主程式
1. 雙擊左方==MAIN(PRG)==

2. 新增兩個變數儲存馬達位置,如下所示,再確保程式碼內容與下方相同,若不相同請確認步驟是否有誤。
```typescript=
master_actpos,slave_actpos: LREAL;
```
```typescript=
PROGRAM MAIN
VAR
master,slave: AXIS_REF;
camming_state: camming_state;
CamInOut, CamOutOut, CamTableSelectOut, MoveMasterOut, MoveSlaveOut, ResetMasterOut, ResetSlaveOut: ST_McOutputs; {*用於綁定模組輸出接口*}
CamIn: MC_CamIn;
CamTableSelect: MC_CamTableSelect;
CamTable: MC_CAM_REF;
CamOut: MC_CamOut;
MoveAbsoluteSlave: MC_MoveAbsolute;
MoveVelocityMaster: MC_MoveVelocity;
MC_Power: MC_Power;
ResetSlave: MC_Reset;
ResetMaster: MC_Reset;
Table: ARRAY[1..4] OF MC_MotionFunctionPoint;
master_actpos,slave_actpos: LREAL;
END_VAR
```

3. 複製下方程式碼貼於右邊下方區塊
```typescript=
master(); {* 更新主軸資訊*}
slave(); {* 更新從軸資訊*}
power(); {* 馬達使能*}
camming();{* 電子凸輪程式*}
reset(); {* 馬達重設*}
move_m_s(); {* 馬達移動*}
table_point(); {* 凸輪表*}
{* 狀態控制*}
CASE camming_state OF
{* 初始化 *}
state_init:
MoveVelocityMaster.Execute := FALSE;
ResetMaster.Execute := FALSE;
ResetSlave.Execute := FALSE;
CamIn.Execute := FALSE;
CamOut.Execute := FALSE;
camming_state:=state_power;
{* 馬達使能 *}
state_power:
IF master.NcToPlc.StateDWord.0 AND master.NcToPlc.StateDWord.0 THEN
camming_state := state_forward;
ELSIF master.Status.Error OR slave.Status.Error THEN
camming_state := state_error;
END_IF
{* 馬達作動 *}
state_forward:
MoveVelocityMaster.Execute:=TRUE;
MoveAbsoluteSlave. Execute:=TRUE;
IF master.Status.Moving AND MoveAbsoluteSlave.Done THEN
MoveVelocityMaster.Execute:=FALSE;
MoveAbsoluteSlave.Execute:=FALSE;
camming_state:=state_pre_table1;
END_IF
IF master.Status.Error OR slave.Status.Error THEN
camming_state := state_error;
END_IF
{* 凸輪表初始化 *}
state_pre_table1:
CamTableSelect.Execute:=TRUE;
camin.CamTableID:=1;
IF CamTableSelect.Done THEN
camming_state:=state_camming1;
CamTableSelect.Execute:=FALSE;
END_IF
IF master.Status.Error OR slave.Status.Error THEN
camming_state := state_error;
END_IF
{* 電子凸輪作用 *}
state_camming1:
camin.Execute:=TRUE;
IF camin.InSync THEN
camin.Execute:=FALSE;
camming_state:=camming_status;
END_IF
IF master.Status.Error OR slave.Status.Error THEN
camming_state := state_error;
END_IF
{* 更新馬達資訊 *}
camming_status:
master_actpos:=master.NcToPlc.SetPos;
slave_actpos:=slave.NcToPlc.SetPos;
IF master.Status.Error OR slave.Status.Error THEN
camming_state := state_error;
END_IF
{* 錯誤處理 *}
state_error:
CamOut.Execute := Slave.Status.Coupled; (* 先解耦 *)
IF not Slave.Status.Coupled THEN
IF Master.Status.Error OR Slave.Status.Error THEN
camming_state := state_reset; (* 軸報錯需要reset*)
ELSE
camming_state := state_init;(*若功能塊報錯,不需要reset*)
END_IF
END_IF
{* 重置 *}
state_reset:
ResetMaster.Execute := TRUE;
CamTableSelect.Execute:=FALSE;
ResetSlave.Execute := TRUE;
IF ResetMaster.Done AND ResetSlave.Done THEN
camming_state := state_init;
ELSIF ResetMaster.Error OR ResetSlave.Error THEN
camming_state := state_init;
END_IF
END_CASE
```

4. 點選上方工具列==Activate Configuration==進行PLC程式編譯,並按下OK

5. 接著出現此確認視窗,此處選擇==確定==

6. 跳至[新增可視化圖表資訊]
---
## 方法2-使用圖形化介面使用電子凸輪
### 建立電子凸輪表
1. 右鍵點擊左方==Table==選單下的==Add New Item==

2. 跳出==Insert Master==視窗,點選OK

3. 此時會跳出此視窗,說明此凸輪表僅能暫存使用(需有授權才能存檔) ,點選確定

:::warning
此方法所建立的電子凸輪表,專案關閉後即會消失,方法1則不會。
:::
4. 右鍵點擊左方==Master 1==選單下的==Add New Item==

5. 跳出==Insert Master==視窗,點選OK

6. 此時會跳出此視窗,說明此凸輪表僅能暫存使用(需有授權才能存檔) ,點選確定

:::warning
此方法所建立的電子凸輪表,專案關閉後即會消失,方法1則不會。
:::
7. 雙擊==Slave 1==進入關鍵點編輯工具

8. 點擊==Insert Point==於下方紅框中新增四個關鍵點,如圖所示


9. 並依照下圖指示修改線型與位置

10. 完成後如下圖所示

11. 雙擊==Master1==,將==Period==打勾,開啟週期循環模式

### 配置主從軸關係
1. 點選上方工具列==Activate Configuration==進行PLC程式編譯,並按下OK

2. 接著出現此確認視窗,此處選擇==確定==

3. 等待數秒後,右上方PLC控制列燈號會亮起,表示編譯完成。

4. 雙擊==slave==,進入==Parameter==選單,將==Position Lag Monitor==選項改為==FALSE==,再按下==Download==

5. 切換至==Online==選單,點選==Set==,並按下==ALL==啟動馬達

6. 將==Target Position==, ==Target Velocity==改為250,並按下綠色執行按鈕,將馬達位置移動到250

7. 將==Master Axis==選為==master==,==Coupling Mode==改為==Cam Profile==,==Table Id==改為1,最後按下==Couple==綁定關係

8. 雙擊==master==,進入==Online==選單,點選==Set==,並按下==ALL==啟動馬達

9. 切換至==Functions==選單,將==Start Mode==改為==Endless==,==Target Velocity==改為100,再按下Start馬達會開始進行電子凸輪運動

10. 按下==Stop==即可停止

:::warning
注意,此方法停止後要重新開始,請務必先將slave馬達回歸至250初始位置
:::
新增可視化圖表資訊
===
1. 右鍵點擊左方選單最上方專案名稱,選取==Add==選單下的==New Project==

2. 專案選擇==TwinCAT Measurement ==,類型選擇==YT Scope Project==

3. 右鍵點擊左方選單==YT Chart==,選擇選單下的==New Axis

4. 重複上個步驟,完成後如下圖所示

5. 右鍵點擊==Axis Group==,選擇==Rename==,將這個三個Group更名為==pos==, ==vel==, ==acc==,完成後如下圖所示。

### 配置位置圖表
1. 右鍵點擊==pos==,選擇==Target Browser==

2. 依照圖片指示展開==slave==目錄

3. 按住==ctrl==並選取==ActPos==, ==SetPos==,並按右鍵選擇==Add to Scope==

### 配置速度圖表
1. 右鍵點擊==vel==,選擇==Target Browser==

2. 依照圖片指示展開==slave==目錄

3. 按住==ctrl==並選取==ActVelo==, ==SetVelo==,並按右鍵選擇==Add to Scope==

### 配置加速度圖表
1. 右鍵點擊==acc==,選擇==Target Browser==

2. 依照圖片指示展開==slave==目錄

3. 按住==ctrl==並選取==ActAcc==, ==SetAcc==,並按右鍵選擇==Add to Scope==

電子凸輪運行測試
===
1. 點選上方工具列==Activate Configuration==進行PLC程式編譯,並按下OK

若出現此錯誤

請前往TwinCAT安裝目錄

選取==win8settick==,右鍵以系統管理身分執行,重新開機後繼續回到此步驟
2. 接著出現此確認視窗,此處選擇==確定==

3. 等待數秒後,右上方PLC控制列燈號會亮起,表示編譯完成。

### 啟動馬達
4. 雙擊==slave==,進入==Parameter==選單,將==Position Lag Monitor==選項改為==FALSE==,再按下==Download==

4. 雙擊==master==或是==slave==,並切換至==Online==選單

5. 點擊==Set==,並按下==All==,啟動馬達。

6. 重複上兩個步驟,啟動另一個軸。
- 啟動圖表功能
1. 右鍵點擊==YT Chart==,選擇==Stacked Axes==,使圖表堆疊顯示。

2. 點擊右上方錄製按鈕,開始錄製圖表(此時圖表將會繪製馬達數據)

### 運行電子凸輪
1. 點擊PLC控制列的==Login==按鈕

2. 點擊YES下載程式到目標主機

3. 下載完成後,等待數秒,PLC控制列啟動與停止燈號會亮起。

4. 點擊==Start==馬達即開始運作電子凸輪,同時圖表會進行繪製。

5. 停止請點擊==Stop==按鈕

6. 停止圖表請按==Stop==按鈕

# 倍福工業電腦通訊
1. 點選左方選單==System==,於畫面中點擊 ==Choose Target==

2. 並選擇已與電腦連接的TwinCAT 主機,再點選OK

:::info
:bulb: **提示**: 如果主機硬體已確定接線但未出現於選單中,請確認TwinCAT EtherCAT模組是否安裝。
[安裝教學請點我](https://infosys.beckhoff.com/english.php?content=../content/1033/ethercatsystem/1036996875.html&id=)
:::