我以前一直以為計算機等的信號傳輸速率都是非常快的,不用計算時間差。
然而在實際應用中發現信息是需要傳輸時間的,而這些時間somehow是可以計算的。
前提信息
波特率 9600;
控制器和執行器通過RS485通信;
控制器發出同步的命令為sync;
RS485: 1 bit start bit, 8 bits length, 1 bit stop bit, no parity check; 所以傳輸一次需要 10 bits的時間;
情景
控制器Control Unit 通過RS485與執行器Actuator通信,控制器在SyncTimeMark
這個時間點發出一個命令,說我需要在SkewTime
之后進行某個動作,而這個動作根據實際工況可能200ms就需要做一次。
執行器收到這個命令的時候已經在SyncTimeMark
之后又過了一個信息傳輸時間,我們稱這個傳輸時間為TransferTime
,開始接到這個信號的時間點為ReceiveTime
。而一條信息可能長這樣: 0x00 0x11 0x22 0x33 0x44 0x55 0x7F
。這樣起始位為0x00,結束位為0x7F,一條信息總共占7個character,也就是7個bytes, 也就是需要傳輸7次,因為RS485一個數據幀有效數據只有8個bits。而傳輸一次需要加上起始位,也就是需要10 bits時間。總共需要70 bits的時間。
time of 1 bit = 1/baud rate = 1/9600 = 0.104 ms;
time of 70 bits = 70 * 0.104 = 7.3 ms;
在一個200ms的動作周期里延遲7ms其實是很大的一個延遲了, 所以我們才需要計算信號延遲時間。
如何計算
BaudSkew = 1/BaudRate;
SkewWidth = SkewWidth + BaudSkew * 10 bits; //從接到信息開始信號就開始計算
SyncTimeMark = ReceiveTime - SkewWidth;
summery
在實際應用里,這個計算肯定會再稍微復雜一些,但是原理就差不多。
這里有一個名詞:
“Overrun time" is to represent the additional time that need to process a received character.