OEM嵌入式通訊模塊
與西門子PLC S7-1200通訊測試
▎OEM嵌入式通訊模塊介紹
OEM嵌入式通訊模塊是一款適用於工業以太網和現場總線協議的嵌入式IC模塊,利用該模塊可快速又輕鬆地把設備集成到工業網路中。目前該系列模塊有支持PROFINET、EtherNet/IP、EtherCAT、Modbus TCP、CANopen、Profibus、DeviceNet、CC-Link等實時通訊協議。OEM模塊對用戶開放了2種串行接口,包括USART接口(標準Modbus RTU協議)和SPI接口,與主控MCU應用程序交換實時網絡數據,從而將設備集成到相應的網路而無需大量的開發工作。另外該模塊還具備32個引腳的IO信號,可以滿足32個點的數字量IO設計,這32個IO引腳可以任意設置成DI或DO。
▍案例說明
本案例以OEM模塊標準評估板(控制器晶片STM32F103VCT6)結合集成PROFINET從站通訊協議的OEM通訊模塊,及西門子S7-1200 PLC作為PROFINET主站為例,進行關於PROFINET通訊模塊的通訊測試。
準備工作
■ OEM模塊標準評估板
功能說明:
1. 開發板上X1端子,直流24V供電。<X1-1:24V、X1-2:0V >。
2. 本開發板支持2種串行接口,包括USART接口和SPI接口。
3. 本開發板具備32個引腳的IO信號,可以滿足32個點的數字量IO設計。
4. 本開發闆對外提供一路RS232信號,用於打印信息。
5. 本開發板主晶片使用STM32F103VCT6,開發例程基於此型號晶片編寫。
6. JP2插針是開發板主晶片的程序燒寫口。
7. 撥動開關S1:撥到ON時,開發板供電;撥到OFF時,開發板斷電。撥動開關S2始終處於OFF狀態。
■ 目標系統
西門子PLC S7-1200作為PROFINET主站,PROFINET通訊模塊插在標準評估板上作為從站,透過網線連接兩個設備進行通訊。評估板上的RS232端口與電腦連接,用Modbus Slave軟體查看接收到的來自PROFINET網路中數據,或者向開發板發送數據從而發送給PLC。
▍通訊測試
OEM嵌入式通訊模塊的通訊測試實際上包括兩個部分:PLC主站與OEM模塊之間的通訊,以及OEM模塊與評估板之間通過USART(Modbus RTU)或者SPI的數據交互,本示例以USART通訊為例說明。
1. 基本配置
(1) OEM 模塊J1~J3 全部斷開,開發板撥碼1~8 全部OFF;
(2) 使用交換機將西門子PLC、開發板、電腦連到一起,PLC 程序下載到PLC;
(3) 使用RS232 連接線,將電腦與開發板的DB1 端口連接;
(4) 電腦打開Modbus Slave 軟體,建立連接。
2. OEM模塊與PLC通訊
2.1 導入對應PROFINET通訊模塊的gsd文件到博圖軟體中,便於之後網路組態與設備配置使用
2.2 選擇–>添加新設備–>找到並添加所使用的PLC型號,這里以S7-1200為例
2.3 找到所導入的GSD文件對應的設備,並添加到設備組態中,並連接PLC與通訊模塊
2.4 配置PLC的IP地址與設備名稱(這裡使用“自動生成PROFINET設備名稱”)
2.5 配置OEM模塊的IP地址與設備名稱,這裡使用預設的GSD文件中sast名稱,也可以對設備額外設置其他名稱,但需注意與網路組態中的一致,否則無法找到設備。
2.6 在設備視窗中添加輸入輸出模塊,這里分別添加32 bytes input和32 bytes outputs為例
2.7 選擇“編譯”,檢查是否有報錯:
2.8 選擇“下載”,在出現的窗口中分配對應的子網,點擊“開始搜索”找到可訪問的設備,並“下載”
2.9 “裝載”配置
2.10 選擇“轉至在線”可監控網路狀態,所添加設備後顯示綠色對勾代表通訊狀態正常。
▍OEM模塊與評估板通訊
3.1 狀態機
3.1 數據區定義
根據功能的不同,OEM模塊用到的數據區劃分為5個區域,分別是:通訊訊息區、下發數據區、下發參數區、設備訊息區、上傳數據區。OEM模塊在“S1 握手”階段讀取設備信息區的數據,由於PROFINET模塊目前未使用此區域的內容,所以用戶僅需要正確回覆報文即可,OEM模塊忽略數據值的內容。
下發數據區(4xxxx區- 10H功能碼)(最大1000字節)
上傳數據區(3xxxx區- 04H功能碼)(最大1000字節)
3.2 USART通訊
1) USART接口波特率支持:9.6Kbps、19.2Kbps、38.4Kbps、57.6Kbps、115.2Kbps、230.4Kbps、460.8Kbps。
2) OEM模塊上電後,在S1握手階段,通過握手報文,OEM模塊可以自動適應用戶的波特率。用戶使用的波特率需要在以上7種波特率之中。
3) USART接口數據幀格式:8 個數據位、偶校驗、1 個停止位。
4) USART使用標準MODBUS協議。
5) OEM模塊做為USART通訊主站,用戶做為USART通訊從站。
6) 用戶串口的處理機制:用戶做為標準的MODBUS從站,只需要在收到OEM模塊的報文命令後,按照相應命令回复報文即可。
7) 通訊報文約定
A. 下發數據
板卡發送
用戶應答:
A. 上傳數據
板卡發送
用戶應答:
Modbus程序示例:
//*******************Modbus數據接收********************//
int user_modbus_deal_rev(void)
{
unsigned int i , tem_start_adr , tem_num ;
unsigned int tem_crc ;
unsigned char tem_hi , tem_lo ;
tem_crc = modbus_crc( URXDBuf , UART_rev_num-2 );
tem_lo = tem_crc & 0xff ;
tem_hi = (tem_crc>>8) & 0xff ;
//**CRC校驗
if( ( URXDBuf[UART_rev_num-2]==tem_hi ) && ( URXDBuf[UART_rev_num-1]==tem_lo ) )
{
if( URXDBuf[1] == 0x10 ) // 功能碼10H
{
tem_start_adr = ( URXDBuf[2] << 8 ) + URXDBuf[3] ;
tem_start_adr = tem_start_adr << 1 ;
tem_num = URXDBuf[6] ;
for( i=0 ; i<tem_num ; i++ )
{
modbus_4_data[ tem_start_adr+i ] = URXDBuf[7+i] ;
}
}
user_modbus_deal_txd();
}
return 1 ;
}
//*******************Modbus數據發送********************//
int user_modbus_deal_txd(void)
{
unsigned int tem , i ;
unsigned int function_code , tem_start_adr , tem_num1 , tem_num2 ;
function_code = URXDBuf[1] ;
// 04H
if( function_code == 0x04 )
{
tem_start_adr = ( URXDBuf[2] << 8 ) + URXDBuf[3] ;
tem_start_adr = tem_start_adr << 1 ; ַ
tem_num1 = ( URXDBuf[4] << 8 ) + URXDBuf[5] ;
tem_num2 = tem_num1 << 1 ;
for( i=0 ; i<tem_num2 ; i++ )
{
modbus_3_data[ tem_start_adr+i ] = modbus_3_data[ tem_start_adr+i ] + 1 ;
UTXDBuf[3+i] = modbus_3_data[ tem_start_adr+i ] ;
}
UTXDBuf[0] = modbus_adr ;
UTXDBuf[1] = 0x04 ;
UTXDBuf[2] = tem_num2 ;
tem = modbus_crc( UTXDBuf , tem_num2+3 );
UTXDBuf[tem_num2+3] = tem >> 8 ;
UTXDBuf[tem_num2+4] = tem ;
UART_trx_num = tem_num2+5 ;
}
// 10H
else if( function_code == 0x10 )
{
for( i=0 ; i<6 ; i++ )
{
UTXDBuf[i] = URXDBuf[i] ;
}
tem = modbus_crc( UTXDBuf , 6 );
UTXDBuf[6] = tem >> 8 ;
UTXDBuf[7] = tem ;
UART_trx_num = 8 ;
}
UART_trx_ctr = 0 ;
UART_rev_ctr = 0 ;
Modbus_TR_State = TR_TURE ;
for( i=0 ; i<10 ; i++ )
USART_SendData( RTU_USART , UTXDBuf[0] );
monitor_print(UTXDBuf[0]);
return 1 ;
}