Arduino Opta PLC實(shí)操案例:貨物傳送
可編程邏輯控制器 (PLC) 是現(xiàn)代工業(yè)自動(dòng)化的基石,為控制機(jī)器和流程提供一個(gè)強(qiáng)大而靈活的平臺(tái)。簡(jiǎn)單來說,PLC是一種工業(yè)數(shù)字計(jì)算機(jī),適用于控制裝配線、機(jī)器人設(shè)備等制造過程,或任何需要高可靠性、容易編程且能進(jìn)行故障診斷的活動(dòng)。PLC發(fā)明于20世紀(jì)60年代末,旨在取代當(dāng)時(shí)復(fù)雜的繼電器和定時(shí)器系統(tǒng)。Richard Morley通常被認(rèn)為是1968年發(fā)明第一臺(tái)PLC(Modicon)的功臣。從那時(shí)起,隨著技術(shù)的不斷發(fā)展,PLC已成為眾多應(yīng)用領(lǐng)域的重要組件,包括機(jī)器控制、樓宇自動(dòng)化、預(yù)測(cè)性維護(hù)、數(shù)據(jù)記錄、遠(yuǎn)程監(jiān)控和安防等。
PLC由以下幾個(gè)關(guān)鍵部件組成:
● 處理器 (CPU):它控制PLC的所有活動(dòng),處理來自輸入模塊的數(shù)據(jù),并向輸出模塊發(fā)送信號(hào)。
● 輸入/輸出模塊 (I/O):PLC可以借助這些模塊與外界互動(dòng)。輸入模塊接收來自傳感器和人機(jī)界面 (HMI) 的數(shù)據(jù),而輸出模塊則向執(zhí)行器和其他設(shè)備發(fā)送信號(hào)。
● 存儲(chǔ)器:存儲(chǔ)用戶的程序和流程所需的其他信息。
● 通信端口:用于實(shí)現(xiàn)PLC與其他設(shè)備(如計(jì)算機(jī)、其他PLC和網(wǎng)絡(luò)系統(tǒng))之間的通信。
● 電源:為PLC及其I/O模塊的運(yùn)行提供必要的電力。
最近,Arduino攜Opta平臺(tái)(圖1)進(jìn)入了PLC市場(chǎng),這是一款安全、易用的微型PLC,具有工業(yè)物聯(lián)網(wǎng) (IIoT) 功能。該平臺(tái)是Arduino與領(lǐng)先的工業(yè)和樓宇自動(dòng)化設(shè)備制造商Finder合作設(shè)計(jì)的。Opta讓專業(yè)人員能夠利用Arduino生態(tài)系統(tǒng)擴(kuò)展自動(dòng)化項(xiàng)目。它支持Arduino sketch和標(biāo)準(zhǔn)PLC語言,包括梯形邏輯圖 (LD) 和功能塊圖 (FBD)。
圖1 Arduino已經(jīng)攜Opta系列PLC進(jìn)入了可編程邏輯控制器市場(chǎng)(圖源:Arduino)
Opta有三種型號(hào):Arduino Opta Lite、Arduino Opta RS485以及功能最豐富的Arduino Opta Wi-Fi?。Opta配備有功能強(qiáng)大的STMicroelectronics STM32H747XI雙核Arm? Cortex?-M7+M4 MCU,可幫助用戶執(zhí)行實(shí)時(shí)控制、監(jiān)控以及實(shí)施預(yù)測(cè)性維護(hù)應(yīng)用。根據(jù)型號(hào)的不同,Opta還提供多種網(wǎng)絡(luò)連接選項(xiàng),包括USB、以太網(wǎng)和Wi-Fi? /低功耗藍(lán)牙,以及RS-485等特定行業(yè)協(xié)議。Opta是一款可安裝在DIN導(dǎo)軌上的設(shè)備,其設(shè)計(jì)高度可靠,采用雙核架構(gòu),無需外部冷卻,可在工業(yè)溫度范圍(-20°C至+50°C)內(nèi)運(yùn)行。Arduino Opta的主要特性包括:
● 安全性:Opta具有安全引導(dǎo)程序,支持使用TLS 1.2進(jìn)行安全通信。
● 方便開發(fā):Opta可使用Arduino IDE或Finder PLC IDE進(jìn)行編程。
● 專業(yè)級(jí)IIoT功能:Opta具有多種連接選項(xiàng),可以連接到互聯(lián)網(wǎng)用于遠(yuǎn)程監(jiān)控。
在本項(xiàng)目中,我們將設(shè)計(jì)一個(gè)概念驗(yàn)證傳送系統(tǒng),按照尺寸對(duì)包裝箱進(jìn)行分類。我們將通過本項(xiàng)目探索有關(guān)Arduino Opta的多個(gè)概念,包括使用Arduino 2.0 IDE和Arduino PLC IDE進(jìn)行開發(fā)。我們還將完成硬件與PLC的連接過程。最后,我們將了解如何通過Arduino云將Opta連接到互聯(lián)網(wǎng)。
物料清單和工具
截至發(fā)布之日,物料清單總成本約為300美元(表1)。
表1 項(xiàng)目物料清單
除了上面的物料,還推薦使用以下工具:
● 小型十字頭和平頭螺絲刀
● 剪線鉗/剝線鉗
● 小型尖嘴鉗
● 數(shù)字萬用表
● 高速互聯(lián)網(wǎng)連接
● 運(yùn)行Windows 10或更高版本的PC
資源
● 貿(mào)澤項(xiàng)目購(gòu)物車在這里。
● GitHub存儲(chǔ)庫在這里。
硬件準(zhǔn)備
本項(xiàng)目將使用兩個(gè)紅外 (IR) 斷光束傳感器來檢測(cè)包裝箱及其尺寸。這類傳感器通常用于物體檢測(cè)、計(jì)數(shù)和安防系統(tǒng)等應(yīng)用中。它們成對(duì)使用,發(fā)射器有兩根線,接收器有三根線。
我們將把這對(duì)傳感器上下堆疊在一起。如果一個(gè)小箱子通過,它只能激活一個(gè)傳感器。而較大的箱子會(huì)中斷兩束光,同時(shí)激活兩個(gè)傳感器。最后,由于這兩個(gè)是5V傳感器,我們需要使用穩(wěn)壓器將電壓從12V降到5V。圖2顯示了這兩個(gè)傳感器與Opta的連接方式。
圖2 顯示硬件連接的接線圖。請(qǐng)注意,上拉電阻是可選的,如果需要,可將紅外接收器OUT引腳連接至降壓轉(zhuǎn)換器的5V電壓(圖源:Green Shoe Garage)
使用以下步驟連接紅外斷光束傳感器:
1.將Opta的12V源極引腳連接到穩(wěn)壓器的正 (+) 輸入端子。
2.將Opta的GND (-) 源極引腳連接到穩(wěn)壓器的負(fù) (-) 輸入端子。
3.將發(fā)射器(紅外LED)的VCC(電源)引腳連接至穩(wěn)壓器的正 (+) 輸出端子。
4.將發(fā)射器的GND(接地)引腳連接至穩(wěn)壓器的負(fù) (-) 輸出端子。
5.將接收器的VCC(電源)引腳連接至穩(wěn)壓器的正 (+) 輸出端子。
6.將接收器的GND(接地)引腳連接至穩(wěn)壓器的負(fù) (-) 輸出端子。
7.對(duì)于上方的斷光束傳感器,將OUT(信號(hào))引腳連接至I3數(shù)字/模擬輸入端子。
8.對(duì)于下方的斷光束傳感器,將OUT(信號(hào))引腳連接至I4數(shù)字/模擬輸入端子。
9.根據(jù)您的具體模塊,可能需要增加一個(gè)上拉或下拉電阻。如果使用下拉電阻,則在信號(hào)引腳和接地引腳之間連接一個(gè)10kΩ電阻。
接下來,將Opta PLC連接到專為對(duì)接直流電機(jī)而設(shè)計(jì)的電路板上。兩塊電路板將通過RS485總線Modbus RTU命令進(jìn)行通信(半雙工,無終端電阻)??刂瓢灏刂浦绷麟姍C(jī)的繼電器,而直流電機(jī)將驅(qū)動(dòng)傳送帶移動(dòng)包裝箱。
Opta控制板包含一個(gè)專用的RS485硬件端口,以嵌入式螺絲端子的形式安裝在外殼頂部。引腳分別標(biāo)記為A(-)、GND和B(+)。除了用于供電的VIN引腳外,電機(jī)控制板還有其他相應(yīng)的引腳。通過以下步驟將PLC與控制器連接起來:
1.將PLC的A(-) 引腳連接到控制板的A(-) 引腳。
2.將PLC的B(+) 引腳連接到控制板的B(+) 引腳。
3.將PLC的GND引腳連接到控制板的GND引腳。
4.將PLC的12V電壓連接到控制板的VIN引腳。
最后,我們必須將12V直流電機(jī)連接到控制繼電器。我們希望兩個(gè)電機(jī)的旋轉(zhuǎn)方向相反。電機(jī)將由Opta 12V端口供電。
1.將Opta的12V引腳連接到控制板的NO1引腳。
2.將繼電器控制板的COM1端口連接到直流電機(jī)的其中一條引線。
3.將直流電機(jī)的另一條引線連接到Opta的GND引腳。
4.將Opta的12V引腳連接到控制板的NO2引腳。
5.將繼電器控制板的COM2端口連接到第二個(gè)直流電機(jī)的其中一條引線。確保引線與第一臺(tái)電機(jī)的引線相反,以保證它們的旋轉(zhuǎn)方向相反。
6.將第二臺(tái)直流電機(jī)的另一條引線連接到Opta的GND引腳。
軟件開發(fā)
Opta的編程有幾種不同的選擇,包括傳統(tǒng)的Arduino IDE 2.0和Web編輯器。Opta還兼容Arduino PLC IDE,可使用工業(yè)自動(dòng)化應(yīng)用中的傳統(tǒng)語言進(jìn)行編程。Opta Wi-Fi?型號(hào)還可以連接到Arduino IoT Cloud,通過Web瀏覽器或Arduino IoT Cloud Remote智能手機(jī)App接收遙測(cè)數(shù)據(jù)和進(jìn)行遠(yuǎn)程控制。
由于我們的要求之一是PLC能與云通信以進(jìn)行遠(yuǎn)程監(jiān)控,因此我們將從Arduino IoT Cloud儀表板開始配置我們的新設(shè)備(圖3)。首先,下載并安裝Arduino Create代理,允許設(shè)備與Arduino Cloud后臺(tái)通信。下載代理程序并查看安裝文檔。安裝完成后,用USB Type-C電纜將Opta連接到運(yùn)行Create代理的開發(fā)人員工作站計(jì)算機(jī)上。
圖3 在Arduino IoT Cloud上配置新設(shè)備(圖源:Green Shoe Garage)
首先,我們只需導(dǎo)航到Devices選項(xiàng)卡,單擊Add按鈕并完成安裝向?qū)?,即可將Opta配置到Arduino IoT Cloud環(huán)境中。這一步將建立安全密鑰,允許Opta通過IoT Cloud秘密通信。我們還需要為Opta創(chuàng)建一個(gè)“數(shù)字雙胞胎”(在Arduino環(huán)境中稱為“thing”)(圖4)。為此,請(qǐng)單擊Things選項(xiàng)卡,然后單擊Create按鈕。
圖4 設(shè)置Opta PLC的數(shù)字雙胞胎(或稱“thing”)(圖源:Green Shoe Garage)
完成后,PLC應(yīng)顯示為已連接到IoT Cloud。如果使用Arduino憑據(jù)登錄,還可以在桌面IDE中訪問基于Web的代碼。
代碼概覽
我們先來看看本項(xiàng)目的關(guān)鍵文件:
● main.ino負(fù)責(zé)設(shè)置設(shè)備和運(yùn)行主循環(huán)的大部分工作。大多數(shù)與項(xiàng)目相關(guān)的源代碼都可以在這里找到。
● thingProperties.h包含一些函數(shù)調(diào)用,用于將物理PLC連接到其在云中的虛擬雙胞胎。
● arduino_secrets.h包含允許Opta連接到本地?zé)o線網(wǎng)絡(luò)的Wi-Fi? SSID和密碼。
o #define SECRET_OPTIONAL_PASS "NETWORK_PASSWORD"
o #define SECRET_SSID "NETWORK_NAME_HERE"
關(guān)鍵庫、函數(shù)和變量
除了默認(rèn)包含的庫,我們還需要通過#include語句添加以下庫:
● ArduinoModbus.h包含處理Modbus RTU通信數(shù)據(jù)包所需的代碼。
● ArduinoTCloud.h允許Opta連接到Arduino IoT Cloud服務(wù)。
● Arduino_ConnectionHandler.h提供一個(gè)ConnectionManager,用于控制連接和斷開、屬性變化更新和事件回調(diào)。
這些庫主要用于Opta與直流電機(jī)控制器板的通信。該控制器板通過Modbus RTU串行通信協(xié)議進(jìn)行通信,具體設(shè)置如下:
● 波特率:9600 bps
● 數(shù)據(jù)位數(shù):8
● 奇偶校驗(yàn)位:No
● 停止位:1
以下是main.ino文件中用于Modbus通信的一些關(guān)鍵函數(shù)和變量:
● byte controlBoardAddress = 0x01設(shè)置電機(jī)控制板的設(shè)備地址。
● int motor1 = 1是電機(jī)寄存器,用于在檢測(cè)到高包裝箱時(shí)控制傳送帶。
● int motor2 = 2是電機(jī)寄存器,用于在檢測(cè)到矮包裝箱時(shí)控制傳送帶。
● int motorTimeOn = 5000設(shè)置檢測(cè)到包裝箱后傳送帶運(yùn)行的持續(xù)時(shí)間。
● ModbusRTUClient.begin(9600) 以給定的波特率啟動(dòng)Modbus功能。
● void holdingRegisterWrite(int dev_address, uint8_t reg_address, uint8_t holding_write)
o int dev_address:電機(jī)控制板的地址可能因制造商而異,請(qǐng)查閱控制板文檔。
o uint8_t reg_address:寫入電機(jī)控制板所執(zhí)行命令的寄存器地址。寄存器編號(hào)與物理繼電器板編號(hào)相對(duì)應(yīng)。該值介于0x00和0x0F之間。
o uint8_t holding_write:被寫入寄存器以控制繼電器的命令。這些命令包括:
● 0x0100:繼電器開啟
● 0x0200:繼電器關(guān)閉
● 0x0300:切換狀態(tài)繼電器
● ModbusRTUClient.lastError() 返回一個(gè)字符串,其中包含Modbus產(chǎn)生的最后一條錯(cuò)誤消息。
接下來,我們檢查斷光束傳感器的代碼。我們可以使用幾種不同的方法進(jìn)行配置,包括將其作為中斷的輸入,以便及時(shí)處理新包裝箱?;叵胍幌?,我們有兩對(duì)發(fā)射器/接收器。發(fā)射器一直處于開啟狀態(tài),因此它們沒有代碼。我們將在代碼中處理接收器信號(hào)。請(qǐng)注意,這些傳感器都是ACTIVE LOW(低電平有效)類型,因此當(dāng)光束因包裝箱的存在而中斷時(shí),PLC將看到0V電壓。表2列出了一些關(guān)鍵函數(shù)和變量:
表2 硬件引腳標(biāo)示
● void setup()
o pinMode(A2, INPUT):下方斷光束傳感器
o pinMode(A3, INPUT):上方斷光束傳感器
o attachInterrupt(digitalPinToInterrupt(A0), lowerBeamBreak_ISR, LOW):如果下方斷光束傳感器跳閘,我們就知道有包裝箱。然后我們將檢查上方斷光束傳感器,以確定包裝箱是高還是矮。
o void lowerBeamBreak_ISR():中斷服務(wù)例程 (ISR) 將檢測(cè)是否有物體干擾下方斷光束傳感器。
最后一大段代碼用于將遙測(cè)數(shù)據(jù)通過Wi-Fi?通信傳回Arduino IoT Cloud。用于實(shí)現(xiàn)云通信的函數(shù)如下:
● void setup()
o initProperties() 初始化“thing”屬性,以允許Opta與IoT Cloud通信。
o ArduinoCloud.begin(ArduinoIoTPreferredConnection) 啟動(dòng)Wi-Fi?通信。
o setDebugMessageLevel(2) 設(shè)置調(diào)試信息的粒度。根據(jù)文檔說明,數(shù)字越大,獲得的信息越詳細(xì);默認(rèn)值為0(僅錯(cuò)誤),最大值為4。
● void loop()
o 主循環(huán)的每次迭代都需要調(diào)用ArduinoCloud.update(),以便將遙測(cè)數(shù)據(jù)發(fā)回云端。
● thingProperties.h
o bool lowerSensorTripped是一個(gè)變量,用于存儲(chǔ)下方斷光束傳感器的狀態(tài)。如果設(shè)置為TRUE,表示檢測(cè)到包裝箱。如果只有下方斷光束傳感器跳閘,說明包裝箱比較小。
o bool upperSensorTripped是一個(gè)變量,用于存儲(chǔ)上方斷光束傳感器的狀態(tài)。如果設(shè)置為TRUE,表示檢測(cè)到包裝箱。如果上方和下方傳感器都跳閘,說明檢測(cè)到了大包裝箱。
o ArduinoCloud.addProperty(lowerSensorTripped, READ, ON_CHANGE, NULL) 將下方斷光束傳感器的狀態(tài)發(fā)送到云端。
o ArduinoCloud.addProperty(upperSensorTripped, READ, ON_CHANGE, NULL) 將上方斷光束傳感器的狀態(tài)發(fā)送到云端。
Arduino PLC IDE
對(duì)Opta進(jìn)行編碼的另一種方法是使用Arduino PLC IDE,這是一種軟件開發(fā)環(huán)境,允許使用IEC 61131-3標(biāo)準(zhǔn)語言對(duì)兼容PLC的Arduino設(shè)備進(jìn)行編程。這是一款免費(fèi)的開源軟件,僅適用于Windows系統(tǒng)。截至本文發(fā)布之日,PLC IDE的功能仍不如市場(chǎng)上其他一些PLC編程軟件豐富。不過Arduino PLC IDE包含多種功能,也是一款功能強(qiáng)大的PLC編程工具:
● 支持五種IEC 61131-3編程語言:梯形圖、功能塊圖、結(jié)構(gòu)化文本、順序功能圖和指令表。
● 適用于Arduino和PLC編程的統(tǒng)一編程環(huán)境。
● 多種調(diào)試工具,幫助查找和修復(fù)代碼中的錯(cuò)誤。
● 易于使用且直觀的用戶界面。
Arduino PLC IDE是一款寶貴的工具,適用于想要對(duì)兼容PLC的Arduino設(shè)備進(jìn)行編程的任何人。它易于使用和配置,并且功能豐富,是一款強(qiáng)大的PLC編程工具。
使用以下步驟安裝和設(shè)置Arduino PLC IDE軟件:
1.從Arduino網(wǎng)站下載Arduino PLC IDE和Arduino PLC IDE Tools。
2.運(yùn)行Arduino PLC IDE Tools安裝程序,并按照安裝說明進(jìn)行操作。
3.安裝完成后,打開Arduino PLC IDE。
4.使用USB電纜將兼容PLC的Arduino設(shè)備連接到計(jì)算機(jī)。
5.在Arduino PLC IDE中,單擊“Tools”菜單,然后單擊“Board”并選擇設(shè)備。
6.在“Port”部分,選擇設(shè)備連接的COM端口。
7.單擊“PLC IDE Bootloader”按鈕,將引導(dǎo)加載程序下載到設(shè)備。
8.下載引導(dǎo)加載程序后,單擊“Connect”按鈕連接到設(shè)備。
9.在“Device License”部分,輸入設(shè)備的硬件ID,然后單擊“Activate”按鈕。
10.現(xiàn)在,您應(yīng)該可以使用Arduino PLC IDE對(duì)兼容PLC的Arduino設(shè)備進(jìn)行編程了。
我們已經(jīng)在GitHub存儲(chǔ)庫中提供了演示如何使用PLC IDE(圖5)對(duì)Opta進(jìn)行編程的代碼。
圖5 Arduino PLC IDE為業(yè)界工程師提供了更常用的PLC開發(fā)工具(圖源:Green Shoe Garage)
最后的組裝和故障排除
硬件已組裝完畢,固件也已經(jīng)燒寫到Opta PLC,我們接下來將為項(xiàng)目測(cè)試做最后的準(zhǔn)備。在我們的設(shè)置中,斷光束傳感器將放置在傳送帶的兩側(cè)(圖6)。我們將把發(fā)射器放在右側(cè),接收器放在左側(cè)。要特別注意將發(fā)射器和接收器水平和垂直對(duì)齊,以便一個(gè)大包裝箱能同時(shí)觸發(fā)兩個(gè)傳感器。請(qǐng)注意確保電線安全、整齊地穿過任何機(jī)械部件,如電機(jī)和傳送帶。
圖6 一個(gè)小包裝箱將僅觸發(fā)下方斷光束傳感器(圖源:Green Shoe Garage)
要查看遙測(cè)數(shù)據(jù),可下載并進(jìn)入Arduino Cloud Remote App,然后選擇相應(yīng)的儀表板(圖7)。
圖7 基于云的儀表板,用于監(jiān)控傳送帶的活動(dòng)(圖源:Green Shoe Garage)
故障排除
如果您在項(xiàng)目中遇到問題,可以參考我們?cè)陂_發(fā)過程中發(fā)現(xiàn)的一些解決方法:
● 具體的連接問題可能隨不同的紅外斷光束傳感器型號(hào)而異,因此請(qǐng)務(wù)必查閱傳感器附帶的數(shù)據(jù)手冊(cè)或任意文檔。
● 確保紅外LED(發(fā)射器)和光電二極管或光電晶體管(接收器)正確對(duì)準(zhǔn),以檢測(cè)光束中斷情況。
● 避免將傳感器暴露在直射陽光或其他紅外光源下,因?yàn)樗鼈兛赡軙?huì)干擾傳感器的運(yùn)行。
● 確保串行通信設(shè)置為9600 bps。
● 如果您的設(shè)備未列在Arduino PLC IDE中,可能需要安裝相應(yīng)的Arduino內(nèi)核。
● 如果您的設(shè)備沒有引導(dǎo)加載程序,則必須使用Arduino IDE進(jìn)行燒寫。
● 在IDE和PLC IDE之間切換時(shí),Wi-Fi?功能可能會(huì)中斷。使用Arduino IDE 2.0,需要通過導(dǎo)航至File > Examples > Portenta H7 board 747_system > example > wififirmwareupdater 來運(yùn)行Wi-Fi固件更新。在固件刷新后,啟動(dòng)串行監(jiān)視器并完成安裝流程。然后刷新項(xiàng)目固件,Wi-Fi?連接即可恢復(fù)。
總結(jié)
五十多年來,在日新月異的技術(shù)領(lǐng)域,PLC始終是工業(yè)自動(dòng)化不可或缺的一部分。Arduino進(jìn)入這類嵌入式系統(tǒng)領(lǐng)域,為工業(yè)系統(tǒng)設(shè)計(jì)人員提供了令人興奮的新選擇,尤其是對(duì)于資源較為有限的小型企業(yè)而言。憑借其出色的適應(yīng)性、靈活性和強(qiáng)大的功能,Arduino Opta PLC系列必將成為現(xiàn)代工業(yè)領(lǐng)域的風(fēng)向標(biāo)。
用Arduino Opta Wi-Fi?代替?zhèn)鹘y(tǒng)PLC,是將設(shè)備連入IIoT系統(tǒng)的一種便捷方式。使用傳統(tǒng)PLC編程技術(shù)的能力,可以幫助習(xí)慣于傳統(tǒng)PLC軟件開發(fā)的系統(tǒng)集成商更快適應(yīng)。
通過本項(xiàng)目,您應(yīng)該對(duì)PLC的原理,以及使我們的工業(yè)化社會(huì)得以運(yùn)轉(zhuǎn)的關(guān)鍵系統(tǒng)有了基本的了解。無論您是工程師、技術(shù)人員,還是僅僅對(duì)技術(shù)感興趣,Arduino Opta PLC都能為您提供強(qiáng)大的學(xué)習(xí)平臺(tái),并為許多實(shí)際的自動(dòng)化和遠(yuǎn)程控制應(yīng)用提供物美價(jià)廉的解決方案。
作者簡(jiǎn)介
專業(yè)工程師Michael Parks是Green Shoe Garage的聯(lián)合創(chuàng)始人。Green Shoe Garage是一家提供定制電子設(shè)計(jì)的工作室和嵌入式安全研究公司,位于馬里蘭州西部。Michael Parks創(chuàng)辦了《Gears of Resistance》播客來提升公眾對(duì)科技的認(rèn)知。他還擁有馬里蘭州專業(yè)工程師資質(zhì),并獲得了約翰·霍普金斯大學(xué)系統(tǒng)工程碩士學(xué)位。
評(píng)論