PDMS call Operating System Command
eryar@163.com
1.Introduction
AVEVA提供了三種二次開發的方式:DARs, PML和AVEVA .Net(C#)。DARs是Fortran的函數庫,也可以用C/C++來開發,依賴的庫少,但是只能用于控制臺的程序,不能使用在MFC或Qt程序中,即不能有友好的用戶界面(GUI),所以對于提取PDMS數據,然后進行一些處理的小程序,此方法還比較適用。
AVEVA的PML和常見的Python, Tcl/Tk, Lua等一樣是一種解釋型的腳本語言,其只能在PDMS軟件中被解釋執行。也相當于批處理文件對于Windows操作系統。PDMS自帶的很多程序就是用PML開發的。腳本語言的顯著優勢就是將常用的命令封裝出來,這樣在測試程序新功能時,不需要編譯源碼,只需要編寫腳本,提高軟件開發效率;使用腳本時需要將功能暴露出來,這樣會對接口的合理性做更多考慮,使軟件架構更清晰等。缺點就是對于復雜算法,執行效率較低。還有就是PML完全依賴AVEVA軟件,脫離AVEVA就像離開空氣的飛機一樣飛不起來。
AVEVA .Net是AVEVA推出的一種更方便的開發方式。結合C#豐富的庫及相對于PML而言更加高效,使用C#在AVEVA上可以快速地開發出應用程序。且PML.Net使得在PML中調用C#的庫成為可能。比如用C#可以直接讀定Word, Excel,甚至AutoCAD的DWG文件,所以使用C#對PDMS進行開發優勢明顯,但也有不足之處,那就是程序調試不方便,當C#的庫DLL被PDMS加載后,不能卸載,不能對源碼實時修改,開發效率有所影響。
PDMS提供了在PML中調用系統命令的命令:syscom。借助這個PML命令,為PDMS的開發又提供了一種新架構(New Architecture)。本文詳細介紹syscom命令的用法,及如何使用這條命令來為PDMS的二次開發指出一條新路。
2.How to...
SYSCOM也是一條PML命令,其用法和其他PML命令一樣,只是其參數是Windows中的DOS命令。如在命令窗口中輸入命令syscom ‘dir’,則可以在控制臺窗口中顯示出當前文件夾中的內容:
Figure 2.1 syscom usage
同理,輸入syscom ‘help’則可以顯示出常見DOS命令的使用說明:
Figure 2.2 syscom call DOS command directly
由此可見,使用syscom相當于運行了一條DOS命令。因為DOS命令可以調用程序,如打開記事本,所以使用syscom也應該可以打開記事本。調用命令syscom ‘notepad’即可以了,如下圖所示:
Figure 2.3 syscom to open a notepad
打開記事本后,可以看見PDMS程序處于等待狀態。只有將記事本關閉,PDMS程序才恢復正常。如何使PDMS程序不用等待調用的程序是否執行完畢呢?PDMS中也提供了方法,那就是在程序名后加個&。如syscom ‘calc&’,就可以打開計算器程序而不用去等待是否將其關閉。
Figure 2.4 syscom to call calculator
3.New Architecture
有了這條命令,把PDMS的擴展性又提高了,因為可以用syscom來調用Windows中的腳本即批處理文件。這樣就可以用批處理來調用其他程序,由此擺脫因為AVEVA .NET(C#)開發時加載DLL后調試的不便,也可擺脫編程語言的限制,只要是一個程序都可以通過批處理來調用,即可以用C/C++或C#甚至VB來編寫程序,再用通過syscom來調用。所以通過syscom調用批處理的方式也是一種全新的開發方式,下面通過一個簡單的例子來進行說明如何將PML的變量傳遞給批處理。將下列代碼保存為syscom.bat放在PDMS安裝目錄:
echo off
set param1=%
1echo echo from syscom.bat

echo
%param1%
在PDMS中輸入命令:
syscom ‘syscom.bat Hi,SYSCOM’
則會在PDMS的控制臺上輸出如下圖所示:
Figure 3.1 pass parameter to batch file
通過這種方式就可以將PDMS中的數據傳遞到自己的程序中了。下面以一個最簡單的C++程序為例來說明。
/*
* Copyright (c) 2015 Shing Liu All Rights Reserved.
*
* File : main.cpp
* Author : eryar@163.com
* Date : 2015-10-27 21:00
*
* Description : a simple C++ program to test PDMS syscom.
*
*/
#include <iostream>
int main(int argc, char* argv[])
{
for (int i = 0; i < argc; ++i)
{
std::cout << "parameter: " << argv[i] << std::endl;
}
return 0;
}
為了簡單起見,將上述代碼生成的程序放到PDMS安裝目錄。在PDMS中測試如下圖所示:
Figure 3.2 pass parameters to C++ program
從上面的例子可以看出,通過syscom可以調用任何應用程序,不管其用什么語言編寫的。甚至可以直接將PML變量傳遞到程序中。這種方式來對PDMS進行開發比用AVEVA .Net(C#)來開發更方便,因為其調試很方便。如果處理的數據量比較大,可以將這些數據導出成文件,通過文件的方式來傳遞也是很方便的。
所以通過syscom調用批處理或應用程序或由批處理來調用程序的開發方式效率更高,且代碼保密性好,把程序的關鍵部分用C或C++或其他編程語言來實現,比PML的保密性好。因為程序和PDMS沒有什么關聯,所以即使不運行PDMS,也是可以使用程序的。更重要的是程序調試方便,開發效率高。因此,這種開發方式可以說是一種全新地、方便地開發方式。
4.Conclusion
綜上所述,通過詳細介紹PML調用系統命令的命令syscom來對PDMS開發的幾種方式進行對比。通過對比,說明使用syscom來調用程序的方式更為便利,且程序便于調試,保密性好。程序的規模也不受限制,可以是簡單的小程序,也可以是復雜一些的應用程序。
5.References
1. AVEVA. DESIGN Reference Manual General Commands
2. AVEVA .NET Customisation User Guide
3. AVEVA Data Access Routines User Guide
4. AVEVA. Software Customisation Guide
5. AVEVA. Software Customisation Reference Manual