高杰
(天津市市政工程設計研究院 天津市 300392)
目前工程師在市政公用工程項目設計時主要采用AutoCAD 軟件進行施工圖設計。相比20年前進行手繪圖紙,工作效率已經大幅提升。可隨著我國人民生活水平不斷提高,城市基礎設施建設投資逐年增加,工程項目數量大增,且規模及復雜度不斷增大。在這樣的形勢下,工程師面對著越來越緊張的工期和越來越激烈的市場競爭,雙重壓力下難免出現圖紙質量下降或設計錯誤,給后續施工帶來麻煩甚至造成工程事故,為國家帶來經濟損失。
本文以污水處理廠自控系統設計為例,介紹一種采用高級語言編程實現程序自動繪圖的方法,可大幅度提升設計效率,并避免設計錯誤。
把工程師從繁瑣的重復的繪圖工作中解放出來,將精力放在設計、創新等更高級的任務中。
城市污染源排出的污水,因含污染物總量或濃度較高,達不到排放標準或不符合環保要求,必需經過污水處理廠進行人工強化處理,以便達到國家規定的排放標準或回用標準。
從處理方法上,污水處理工藝分為物理法、化學法和生物法;從處理深度上,處理工藝分為一級、二級、三級和深度處理。污水處理工藝設計要求技術先進,經濟合理,費用最省。
污水處理廠設計包括各種不同處理階段所需的構筑物、建筑物、設備、管道、廠區道路、綠化、管線綜合、給排水、供配電、自控儀表等。
污水處理廠自控系統構成整個污水處理工程的重要組成部分,其設計優劣及功能穩定直接關系到全廠設備的正常運行。
自動控制系統采用基于可編程邏輯控制器(PLC)的集散型控制系統,通過現場PLC 完成各自轄域內工藝設備和檢測儀表的數據采集和自動控制。
控制系統由三級組成:
第一級——就地控制(現場控制柜控制);
第二級——過程控制(各PLC 控制站控制);
第三級——監控管理(中央控制室監控)。
自控專業施工圖設計一般包括控制系統結構圖、PLC 配置圖、PLC 模塊接線圖(圖1)、電纜清冊(圖2)、自控安裝圖等。其中用于直接指導自控設備生產和現場工人安裝的是PLC 模塊接線圖、電纜清冊,這兩部分也是設計中最為繁瑣和容易出錯的地方。對于一個中等規模的處理廠,其需要接入自控系統的工藝設備和儀表可超過600 個,設置大小PLC 控制站在20 臺左右,輸入輸出信號超過5000 點,安裝電纜3000 余根。
這種圖紙繪制和錯誤排查由人工來做是一項耗費精力、枯燥且極易犯錯的工作。但不難看出,它是一項重復性強且有規律的工作,應該采用編程的方法由計算機自動完成。

圖1:PLC 模塊接線圖

圖2:電纜清冊
AutoCAD 自帶高級編程語言LISP,但使用它做復雜的設計需要很高的編程技巧,若要設計用戶界面,難度就更高了。而C++語言在實現復雜邏輯運算上擁有絕對優勢,若使用VC,更可輕松實現用戶界面設計。
本文提出利用AutoCAD 腳本文件作為接口,實現C++語言直接生成繪圖指令,控制AutoCAD 自動繪圖方法。
AutoCAD 腳本實際上就是批處理命令,是AutoCAD 命令提示行中所用的命令的一個有序集合。腳本文件中的每一行對應著AutoCAD 命令提示行中的一個命令,將它們按一定順序組合在一起就可實現復雜的制圖工作。
腳本文件是純文本文件,可直接打開、編輯、修改,閱讀起來也很直觀。

圖3:程序可視化界面
對于上述的純文本文件,用C++語言進行創建、讀寫非常簡單,使用CFile 類即可實現。
在CAD 中的所有繪圖工作可分解為若干種基本操作,如畫一條線段、畫一條弧線、寫一段文本等。這些基本操作都有對應的腳本命令,如“_LINE 100,100 500,500”表示以坐標(100,100)為起點,(500,500)為終點畫一條線段,“_MTEXT 350,110 監測儀表組電源”表示以坐標(350,110)為基點插入一行文字。
圖2 的電纜清冊可以拆分成繪制線段和插入文字2 種基本操作,只要指定了表格間距,就可使用C++簡單的循環邏輯輕松繪制出來,而C++輸出的是一組腳本指令,并將他們存儲在文本文件中,CAD 調用該文件后即可自動生成表格。更復雜的圖紙繪制原理也一樣。
用C++語言實現繪圖首先要先編寫一些基本的繪圖函數,每個函數對應著一個CAD 的基本操作的腳本命令。函數的參數盡量設計成和腳本命令的參數基本一致,這樣在后續C++編程中可以采用與編寫腳本類似的語法和習慣。函數的輸出則是在生成的腳本文件中插入一行對應基本繪圖操作的腳本命令。
例如上一節所述的畫一條線段的C++函數可以定義成:
void DrawLine(CFile* infile,long x1,long y1,long x2,long y2)
其含義是以(x1,y1)、(x2,y2)為端點畫一條線段,函數執行結果就是在已打開的infile文本文件中加入一行畫線的腳本命令。可以看出調用該函數時的語法與編寫腳本文件的語法極其類似。
同樣的我們定義了過對角線上兩頂點坐標畫矩形的函數:
void DrawRect(CFile* infile,long x1,long y1,long x2,long y2)
以及在指定點插入文字的函數:
void DrawText(CFile* infile,long x1,long y1,long x2,long y2,char*data)
C++語言的優勢在于面向對象的思想,自控專業制圖中,我們考慮將系統中的每一臺設備作為一個對象。前文已經介紹了,對于污水處理廠中的設備,首先在地理上它們位不同的建(構)筑物中,其次在自控網絡中它們接入了不同的PLC 分控站中,從傳輸數據角度看,每臺設備擁有各自的輸入和輸出端口,并向系統發送和接收著不同定義的數據。
我們將設備封裝為一個類,它的定義如下:
class instrument
{
char name[30];//設備名稱
char shortname[10];//名稱縮寫
char construct[30];//所在建筑物
char construct_ID[10];//建筑物位號
char PLC[10];//所屬分控站
char position[50];//信號線接線點
char m_DI[20][20];//數字量輸入信號
char m_DO[10][20];// 數字量輸出信號
char m_AI[10][20];// 模擬量輸入信號
char m_AO[10][20];// 模擬量輸出信號
bool pow;//是否提供電源
}
成員變量包含了所有繪圖時需要用到的設備屬性。同時定義了繪制自控圖紙的成員函數:
void draw_IOlist(CFile* infile,long x,long y)//繪制輸入輸出信號統計表
void draw_IOcable(CFile* infile,long x,long y)//繪制電纜清冊
void draw_IOmodule(CFile* infile,long x,long y)//繪制IO 模塊接線圖
這些函數都是反復調用前文介紹的基本繪圖函數。函數執行結果是在打開的infile 文本文件中加入若干行腳本命令。
程序的工作就是遍歷所有生成的設備類(instrument)實體的所有成員函數,當所有函數均按順序執行一遍后,infile 文件就包含了完成圖紙的所有腳本指令,在CAD 中調用這個腳本文件即可自動生成圖紙。
在程序自動繪圖之前,工程師需要把全廠幾百個設備的信息錄入程序,以便生成設備類(instrument)實體,每個設備又包含了至少10 個屬性,這仍然是一項繁瑣而容易出錯的工作。因此必須設計一個直觀且易操作的用戶界面幫助工程師完成錄入工作。
這里采用Visual C++開發一個可視化界面,可以幫助用戶完成對設備的添加、刪除、屬性編輯、復制等操作。程序可以將所有添加的設備按所在構筑物分類列出,當點選設備后,其所有屬性將呈現出來,方便用戶查詢、修改。程序可將一個工程項目的所有信息保存為一個文件,供用戶隨時調取。
當所有工程信息錄入完成并核對無誤后,用戶可通過程序提供的制圖按鈕生成繪制該工程自控專業圖紙的腳本文件。程序可視化界面如圖3 所示。
目前計算機技術已經廣泛應用于工程設計行業,在該領域中,專業劃分較多,現有的成熟軟件遠沒有覆蓋到所有專業,現在市面上有針對建筑、橋梁、管網、電網等行業的專業輔助設計軟件,但本文所說的自控系統設計,因其涉及的領域較窄較偏,還沒有現成的商業軟件可用。
本文提供的思路是,采用高級語言編寫程序自動生成腳本文件,并用腳本自動生成CAD 圖紙,它沒有程序之間相互調用,開發者不需掌握復雜的接口、庫函數,以及兼容性問題。對于一線的工程技術人員,只要有簡單的高級語言知識,即可寫出自己專業需要的自動繪圖軟件。冷門專業的工程師可以通過此方法提高自身的工作效率。