李洲山
(西安建筑科技大學(xué) 信息與控制工程學(xué)院,陜西 西安 710055)
隨著信息技術(shù)和自動化技術(shù)的高速發(fā)展,各種現(xiàn)場總線應(yīng)用廣泛而且各有優(yōu)缺點[1],從而出現(xiàn)了多總線共存的現(xiàn)象。然而,不同現(xiàn)場總線之間的不兼容性給用戶帶來極大的不便。因此,不同總線標準之間的協(xié)議集成逐漸成為一個研究熱點,文章正是基于這樣的狀況,選擇了國內(nèi)應(yīng)用廣泛的Modbus總線和Profibus-DP總線作為研究對象,主要從總線時序方面研究了兩種協(xié)議之間的雙向轉(zhuǎn)換過程。在Profibus-DP總線側(cè),協(xié)議轉(zhuǎn)換模塊作為從站與PLC主站進行通信,在Modbus總線一側(cè),協(xié)議轉(zhuǎn)換模塊作為主站向Modbus從站設(shè)備寫入命令并讀取從站數(shù)據(jù)。通過本文開發(fā)的協(xié)議轉(zhuǎn)換模塊用戶能夠?qū)odbus從站設(shè)備快速組態(tài)到Profibus-DP總線網(wǎng)絡(luò),有助于增強Modbus的組網(wǎng)能力,在工程應(yīng)用中可以縮短工程周期,降低自動控制系統(tǒng)設(shè)計和維護的費用,使系統(tǒng)設(shè)計更為靈活。
對整個協(xié)議轉(zhuǎn)換模塊而言,Profibus-DP側(cè)的主站和從站的數(shù)據(jù)交換是同步運行的,主站在請求數(shù)據(jù)后只有從站應(yīng)答后才會繼續(xù)執(zhí)行程序。Modbus總線上站與從站之間的數(shù)據(jù)交換則是根據(jù)輪詢的數(shù)據(jù)查詢方式完成的。但是,Profibus-DP的數(shù)據(jù)處理和Modbus側(cè)的通信過程則是獨立運行的。兩種協(xié)議之間的數(shù)據(jù)轉(zhuǎn)換是在VPC3+C芯片中通過映射關(guān)系完成的。在模塊上電后,主站完成初始化,檢測從站是否準備好數(shù)據(jù)通信,如果從站準備好數(shù)據(jù)交換,DP主站將對從站進行相關(guān)參數(shù)設(shè)置,并檢查從站接口的配置狀態(tài)。如果DP從站已經(jīng)準備好數(shù)據(jù)交換,則Profibus-DP側(cè)主站與從站進行數(shù)據(jù)交換。同理,Profibus-DP側(cè)從站進行與主站相對應(yīng)的操作。
協(xié)議轉(zhuǎn)換設(shè)計的重點是對串口收發(fā)程序的實現(xiàn)。目前,基于微處理器串口的數(shù)據(jù)處理方式有3種:(1)輪詢方式。這種方式是通過程序持續(xù)性的查詢接口設(shè)備的數(shù)據(jù)信息,相對程序開銷比較大,不能保證數(shù)據(jù)處理的快速性要求。(2)中斷方式。這種通信方式大幅度提升了數(shù)據(jù)處理速度,但是同樣也要占用一部分系統(tǒng)資源,如果不停出現(xiàn)中斷,系統(tǒng)程序開銷也會大幅度增加[2]。(3)DMA通信方式。這種通信方式能夠?qū)④浖绦蛱幚淼墓δ芤平唤o硬件處理,無論在數(shù)據(jù)處理速度還是數(shù)據(jù)交換的可靠性等方面,相比于軟件處理數(shù)據(jù),都占有明顯的優(yōu)勢。
在Profibus-DP主站與Modbus從站進行通信時,通信請求由DP主站發(fā)出,當協(xié)議轉(zhuǎn)換模塊接收到請求報文后,通過協(xié)議芯片VPC3+C對報文進行解析[3],然后處理報文,提取數(shù)據(jù)域信息,通過協(xié)議數(shù)據(jù)映射關(guān)系,Profibus-DP中的數(shù)據(jù)從新封裝成為Modbus格式發(fā)送給從站設(shè)備。當從站設(shè)備返回應(yīng)答信息時,同樣經(jīng)過這個過程將數(shù)據(jù)傳輸?shù)絇rofibus-DP主站一側(cè)。
根據(jù)上述報文處理結(jié)構(gòu)設(shè)計相關(guān)主程序來控制協(xié)議轉(zhuǎn)換模塊的數(shù)據(jù)處理過程,該過程大體分為3部分:(1)對STM32微控制器的初始化,包括配置系統(tǒng)時鐘、配置嵌套中斷向量表、配置看門狗時鐘、初始化數(shù)據(jù)緩存區(qū)、初始化協(xié)議芯片等工作。(2)循環(huán)地不斷從協(xié)議芯片VPC3+C讀取數(shù)據(jù)和寫數(shù)據(jù)。(3)如果有外部診斷,系統(tǒng)會進入中斷程序[4]。協(xié)議轉(zhuǎn)換的函數(shù)主題如下所示,主要包含程序初始化、數(shù)據(jù)循環(huán)讀寫、中斷處理程序。
Int main(void)
{
u8 i;
RCC_Configuration();
NVIC_Configuration();
VC3_GPIO_Configuration();
SysTick_GPIO_Configuration();
SysTick_Configuration();
DisableInterrupts();
VC3_RST=0;
init_data_buffer();
vpc3_buf_check();
user_dps_reset();
EnableInterrupts();
USART_AS_Init();
InitTimer2();
IWDG_Configuration();
while (1)
{
LEDexOut=LEDexIn;
DP_status=Read_byte_vpc3(spc3_is_reg_status0_add);
if(DP_status)
{
IWDG_ReloadCounter();
}
read_data_from_spc3();
write_data_to_spc3();
diag_check();
CHKSFRData();
if(CommportCount>200)
{
USART_AS_Init();
InitTimer2();
CommportCount=0;
}
}
}
/* 函數(shù)原型 -----------------------------------------------*/
void RCC_Configuration(void); / /Configure different system clock
void NVIC_Configuration(void); //配 置嵌套中斷向量表
void IWDG_Configuration(void); //配 置看門狗
void init_data_buffer(void); //初 始化數(shù)據(jù)緩存區(qū)
void user_dps_reset(void); //初 始化VPC3
void dps2_reset_user_wd(void); //reset the WDT of vpc3
void read_data_from_VPC3+C(void); //rea d data from the RAM of vpc3
void write_data_to_VPC3+C(void); //write data to the RAM of vpc3
void diag_check(void);//check the buffers and state
void vpc3_buf_check(void); //檢 查寫入與讀出vpc3的數(shù)據(jù)是否相同
文章主要設(shè)計了協(xié)議轉(zhuǎn)換的主程序以及串口收發(fā)程序,設(shè)計了模塊在Profibus-DP總線側(cè)的從站功能程序以及模塊在Modbus總線側(cè)的主站功能程序,設(shè)計內(nèi)容主要包括程序的初始化和數(shù)據(jù)處理中斷方式。最后,本文根據(jù)整體設(shè)計介紹了協(xié)議轉(zhuǎn)換模塊對兩種總線協(xié)議數(shù)據(jù)轉(zhuǎn)換的實現(xiàn)方式,包括數(shù)據(jù)如何映射、中斷過程怎樣進入、主循環(huán)程序怎樣進行等。通過報文轉(zhuǎn)換、數(shù)據(jù)收發(fā)等程序,最終成功實現(xiàn)了Modbus協(xié)議和Profibus協(xié)議的轉(zhuǎn)換,在工業(yè)應(yīng)用中具有一定的實際意義。