胡選仲,張 鵬,陳景光,陳 城
(中機試驗裝備股份有限公司,吉林 長春 130103)
隨著科技的不斷發(fā)展,對校直機(車橋校平類)的需求日益增加。由于此類設(shè)備之前應(yīng)用進口光柵尺,成本較高,不利于校直機(車橋校平類)設(shè)備的應(yīng)用。經(jīng)過多年的研發(fā),國產(chǎn)光柵尺現(xiàn)已可以滿足校直產(chǎn)品的應(yīng)用需求。
本文根據(jù)實際情況和對光柵尺應(yīng)用情況的綜合評估,選擇國產(chǎn)光柵尺和對應(yīng)的采集盒,并將其應(yīng)用于校直設(shè)備。國產(chǎn)光柵尺系統(tǒng)在校直機產(chǎn)品上的成功應(yīng)用,標志著國產(chǎn)光柵尺可以代替進口光柵尺產(chǎn)品,這會極大地降低此類產(chǎn)品的成本、縮短此類原材料的采購周期,具有重要的應(yīng)用價值。
針對適配器多路國產(chǎn)光柵尺數(shù)據(jù)采集進行針對性的開發(fā),利用串口(RS485)進行適配器與上位機通信,獲得采集盒采集到的原始光柵尺數(shù)據(jù),再將采集到的數(shù)據(jù)進行解析與處理,最終得到多路光柵尺中每路光柵尺的具體數(shù)據(jù)。把這些數(shù)據(jù)作為校直產(chǎn)品的基本數(shù)據(jù),再根據(jù)校直的具體需求進行運算處理,最終達到完成校直產(chǎn)品的目的,硬件構(gòu)成如圖1所示。
圖1 硬件構(gòu)成
2.2.1 上位機
配置要求:上位機需具備串口通信接口,如果上位機只有RS232串口接口,那就需要外部連接一個RS232轉(zhuǎn)RS485的硬件(如圖2所示)。
圖2 RS232轉(zhuǎn)RS485的硬件
2.2.2 適配器
功能:首要任務(wù)是適配器進行光柵尺數(shù)據(jù)采集工作,這也是適配器的基本工作,適配器與光柵尺交互數(shù)據(jù)信息如圖3所示。適配器完成數(shù)據(jù)采集后,將數(shù)據(jù)提供給上位機。上位機利用串口通信的方式,從適配器讀到當前所有光柵尺的數(shù)據(jù),間接獲得光柵尺數(shù)據(jù)。適配器在光柵尺數(shù)據(jù)的采集過程中,起到了承上啟下的作用。
圖3 適配器與光柵尺交互數(shù)據(jù)信息
2.2.3 光柵尺
精度:分辨率0.01μm級別;功能:利用光柵的光學(xué)原理工作,能夠精密反饋位移,其數(shù)據(jù)是校直軟件中測量數(shù)據(jù)的基礎(chǔ)值,所以要求較高,必須準確無誤地反饋位移值,才能為保證校直精度和節(jié)拍提供基本保障。
系統(tǒng):Windows7;軟件:Visual Studio 2017、DevExpressComponentsBundle-18.1.6;語言:C#語言;描述:利用DevExpressComponentsBundle-18.1.6控件中的串口控件,通過C#語言進行光柵尺數(shù)據(jù)采集模塊的編程與開發(fā)[1]。
通信模式:串口通信。
串口參數(shù):
波特率:115200bps;停止位:1位;數(shù)據(jù)位:8位;校驗位:無奇偶校驗位。
協(xié)議類型:USART協(xié)議。
傳輸方式:RS485。
數(shù)據(jù)結(jié)構(gòu)介紹與描述:數(shù)據(jù)ID和數(shù)據(jù)域的關(guān)系如圖4所示。
圖4 數(shù)據(jù)ID和數(shù)據(jù)域
數(shù)據(jù)描述:
幀頭:0X1A;STA:狀態(tài)域;EA:錯誤及報警;D00~D03:編碼器0數(shù)據(jù)(數(shù)據(jù)全0XFF表示編碼器未連接,數(shù)據(jù)全為0XEE表示CRC錯誤);D10~D13:編碼器1數(shù)據(jù)(數(shù)據(jù)全0XFF表示編碼器未連接,數(shù)據(jù)全為0XEE表示CRC錯誤);D20~D23:編碼器2數(shù)據(jù)(數(shù)據(jù)全0XFF表示編碼器未連接,數(shù)據(jù)全為0XEE表示CRC錯誤);D30~D33:編碼器3數(shù)據(jù)(數(shù)據(jù)全0XFF表示編碼器未連接,數(shù)據(jù)全為0XEE表示CRC錯誤)。
首先是硬件的搭建,把多路光柵尺與適配器相連接,再把適配器和上位機連接,這樣就可以利用串口通信協(xié)議[2,3],使上位機和適配器之間建立通信及信息交互。具體交互信息是利用上位機向適配器發(fā)送事先定義的請求數(shù)據(jù),適配器給上位機返回采集到的原始數(shù)據(jù),上位機對數(shù)據(jù)進行分析,最終解析出每個光柵尺的數(shù)據(jù),完成上位機與適配器接口之間信息交互。
主要設(shè)置串口通信參數(shù),然后再打開串口,程序如下:
var port = new SerialPort {PortName = "COM" + (GlobalParametersManager.SysS etting.SensorComPort + 1), };
port.BaudRate = 115200;
port.DataBits = 8;
port.StopBits = StopBits.One;
port.Parity = 0; GlobalParametersManager.serialPortManager.OpenSerialPort(port, s =>
{
try
{
s = s.Trim();
if (s.Length != 11)
{
LoggingHelper.Error(string.Format(LNG._("光柵尺錯誤"), s), true);
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
});
Thread.Sleep(10);
通過串口讀取數(shù)據(jù),再進行數(shù)據(jù)處理(讀取每個光柵尺數(shù)據(jù)并轉(zhuǎn)換數(shù)據(jù)單位到μm)。校直軟件要求數(shù)據(jù)采集過程中不能有錯誤,故采用了報錯機制,不論哪一路數(shù)據(jù)異常,都會通過軟件界面報錯提示客戶,并附帶處理建議和方法,具體程序如下:
private void ComReceive(object sender, SerialDataReceivedEventArgs e)
{
int data1 = 0, data2 = 0;
ReceiveCompleted = false;
if (_recStaus) //如果已經(jīng)開啟接收
{
try
{
Thread.Sleep(50);
ReceivedDataPacket = new byte[CurrentSerialPort.BytesToRead];
ReceivedDataPacketChar = new char[CurrentSerialPort.BytesToRead];
// change to char datas
if (ByteMode)
{
CurrentSerialPort.Read(ReceivedDataPacket, 0, ReceivedDataPacket.Length);
if (ReceivedDataPacket.Length == 12)
{
string strTemp = "";
if (ReceivedDataPacket[0] == 26)
{
string[] abc = new string[4];
int[] abcd = new int[4];
if ((ReceivedDataPacket[5]) == 255) //判斷1號光柵尺錯誤
{
strTemp = "1號光柵尺錯誤,";
LoggingHelper.Error(LNG._(strTemp + "請檢查1號光柵尺是否連接正常"), true);
return;
}
else if (ReceivedDataPacket[5] == 0) //1號光柵尺返回正常數(shù)據(jù)
{
for (int k = 0; k < 4; k++)
{
abc[k] = ReceivedDataPacket[1 + k].ToString();
abcd[k] = Convert.ToInt32(abc[k]);
}
data1 = abcd[3] + abcd[2] * 256 + abcd[1] * 256 * 256 + abcd[0] * 256 * 256 * 256;
//光柵尺每變化一個分辨率大小,串口數(shù)據(jù)增加1(29Bit 分辨率:10μm)
data1 = data1 / 100;
GlobalParametersManager.IntParas[0] = data1;
ErrCount = 0;
}
else//判斷1號光柵尺錯誤
{
strTemp = "1號光柵尺錯誤,";
LoggingHelper.Error(LNG._(strTemp + "關(guān)閉軟件后對光柵尺重新上電"), true);
return;
}
if ((ReceivedDataPacket[10]) == 255) //判斷2號光柵尺錯誤
{
strTemp = "2號光柵尺錯誤,";
LoggingHelper.Error(LNG._(strTemp + "請檢查2號光柵尺是否連接正常"), true);
return;
}
else if (ReceivedDataPacket[10] == 0) //2號光柵尺返回正常數(shù)據(jù)
{
for (int j = 0; j < 4; j++)
{
abc[j] = ReceivedDataPacket[6 + j].ToString();
abcd[j] = Convert.ToInt32(abc[j]);
}
data2 = abcd[3] + abcd[2] * 256 + abcd[1] * 256 * 256 + abcd[0] * 256 * 256 * 256;
data2 = data2 / 100;
GlobalParametersManager.IntParas[1] = data2;
ErrCount = 0;
}
else//判斷2號光柵尺錯誤
{
strTemp = "2號光柵尺錯誤,";
LoggingHelper.Error(LNG._(strTemp + "關(guān)閉軟件后對光柵尺重新上電"), true);
return;
}
}
else//判斷光柵尺錯誤
{
LoggingHelper.Error(LNG._(strTemp + "關(guān)閉軟件后對光柵尺重新上電"), true);
return;
}
}
else if (ReceivedDataPacket.Length > 1) //判斷光柵尺錯誤
{
LoggingHelper.Error(LNG._("光柵尺異常,關(guān)閉軟件后對光柵尺重新上電"), true);
}
}
else
{
CurrentSerialPort.Read(ReceivedDataPacketChar, 0, CurrentSerialPort.BytesToRead);
string strTemp = "";
foreach (var b in ReceivedDataPacketChar)
{
strTemp += string.Format("{0}", b);
}
LoggingHelper.Message(LNG._("接收到串口數(shù)據(jù):") + strTemp);
_action?.Invoke(strTemp);
}
ReceiveCompleted = true;
}
catch (Exception)
{
if (CurrentSerialPort.IsOpen == false) //如果ComPort.IsOpen == false,說明串口已丟失
{
SetComLose(); //串口丟失后相關(guān)設(shè)置
}
else
{
LoggingHelper.Error(LNG._("不能接收數(shù)據(jù)"));
}
}
}
else //暫停接收
{
CurrentSerialPort.DiscardInBuffer(); //請接收緩存
}
}
通過串口進行數(shù)據(jù)發(fā)送,如果上位機想要得到光柵尺數(shù)據(jù),就需要上位機向光柵尺采集盒發(fā)送固定的數(shù)據(jù)(光柵尺采集盒已經(jīng)定義的協(xié)議),具體代碼程序如下:
var rc = false;
Byte[] WriteBuffer00 = new byte[1];
WriteBuffer00[0] = 0X1A;
rc = GlobalParametersManager.serialPortManager.SendDataPacket(WriteBuffer00); //向適配器發(fā)送數(shù)據(jù)
if (!rc) //返回值異常
{
LoggingHelper.Error(LNG._("采集光柵尺指令發(fā)送異常"), true);
return;
}
本文詳細介紹了光柵尺數(shù)據(jù)采集過程,并成功地將國產(chǎn)光柵尺應(yīng)用于校直設(shè)備。通過此次產(chǎn)品開發(fā),可以極大地降低生產(chǎn)成本、縮短采購周期,從而有效提高此類校直機的市場競爭力。通過已經(jīng)在部分項目上的成功應(yīng)用,證明國產(chǎn)光柵尺完全可以廣泛地應(yīng)用在此類校直機產(chǎn)品上。