梁楓 沈洲 江蘇省廣播電視總臺
時(shí)鐘跳變預(yù)警發(fā)布系統(tǒng)在江蘇廣電總臺的應(yīng)用
梁楓 沈洲 江蘇省廣播電視總臺
本文以江蘇廣電總臺時(shí)鐘系統(tǒng)為例,分析了當(dāng)前時(shí)鐘系統(tǒng)運(yùn)行的現(xiàn)狀、薄弱環(huán)節(jié)和改造情況,由此設(shè)計(jì)一種多來源時(shí)鐘比對預(yù)警發(fā)布系統(tǒng),介紹了其設(shè)計(jì)原理、系統(tǒng)構(gòu)成及應(yīng)用情況。
北斗/GPS時(shí)鐘 多級防跳變 時(shí)鐘比對 預(yù)警發(fā)布
電視臺時(shí)鐘系統(tǒng)是一個(gè)大型通信計(jì)時(shí)系統(tǒng),用以實(shí)現(xiàn)電視臺內(nèi)部相關(guān)技術(shù)系統(tǒng)之間的時(shí)間信號統(tǒng)一,便于電視臺內(nèi)演播、制作、播出鏈路的所有環(huán)節(jié)在同一時(shí)間下準(zhǔn)確無誤地工作。時(shí)鐘系統(tǒng)使臺內(nèi)編播人員時(shí)刻掌握標(biāo)準(zhǔn)的時(shí)間信息,為臺內(nèi)各個(gè)崗位之間順暢的配合工作提供準(zhǔn)確、統(tǒng)一的時(shí)間依據(jù),確保電視臺各相關(guān)業(yè)務(wù)部門的高效運(yùn)轉(zhuǎn),因此確保時(shí)鐘系統(tǒng)的可靠運(yùn)行至關(guān)重要。本臺自主研發(fā)了一套多來源時(shí)鐘信號比對及預(yù)警發(fā)布系統(tǒng),有效的提高了對時(shí)鐘系統(tǒng)的監(jiān)控能力,提升了安全播出的保障水平。
江蘇廣電總臺全臺統(tǒng)一時(shí)鐘系統(tǒng)投入使用已有多年,圖1是改造前的時(shí)鐘系統(tǒng)圖。系統(tǒng)中使用的單GPS的TVZ3100校時(shí)母鐘進(jìn)入老化期,時(shí)有失鎖情況產(chǎn)生,還出現(xiàn)過無故跳秒的現(xiàn)象,給安全播出帶來了極大隱患。由于送往演播室的時(shí)鐘信號不具備防跳變功能,而送往播控系統(tǒng)的時(shí)鐘具備防跳變功能,如果時(shí)鐘源發(fā)生跳變會(huì)導(dǎo)致演播室的時(shí)鐘跟著跳變而播控系統(tǒng)的時(shí)鐘保持原有狀態(tài)繼續(xù)走時(shí),這使得演播室系統(tǒng)與播控系統(tǒng)的時(shí)鐘出現(xiàn)不一致。對于直播節(jié)目來說,時(shí)鐘不一致會(huì)導(dǎo)致節(jié)目切換不準(zhǔn)確,最終引發(fā)播出事故,因此將原有時(shí)鐘源進(jìn)行更新已迫在眉睫。另外,雖然各來源的時(shí)鐘系統(tǒng)都配備了顯示模塊進(jìn)行時(shí)鐘監(jiān)看,但是時(shí)鐘失鎖或者跳變往往發(fā)生在一瞬間,值班人員很難第一時(shí)間發(fā)現(xiàn)時(shí)鐘異?,F(xiàn)象。為此,我們開發(fā)了一套多來源時(shí)鐘信號比對及預(yù)警發(fā)布系統(tǒng)。該系統(tǒng)可對多個(gè)時(shí)鐘源和時(shí)鐘倒換后的輸出信號進(jìn)行實(shí)時(shí)比對,第一時(shí)間發(fā)現(xiàn)出現(xiàn)異常的時(shí)鐘信號節(jié)點(diǎn),并進(jìn)行實(shí)時(shí)語音報(bào)警提醒和發(fā)送微信消息提醒。
圖1 改造前時(shí)鐘系統(tǒng)圖
改造后的時(shí)鐘系統(tǒng)如圖2所示。系統(tǒng)采用了廣電時(shí)通的ST3100B時(shí)鐘,該時(shí)鐘為可接收北斗/GPS信號的雙模時(shí)鐘,同時(shí)該時(shí)鐘還內(nèi)置了高穩(wěn)鐘模塊。A、B兩路時(shí)鐘分別接收北斗/GPS信號并鎖定,輸出EBU時(shí)鐘信號送入時(shí)碼倒換器,如果外來接收信號發(fā)生異常,則會(huì)采用時(shí)鐘內(nèi)部高穩(wěn)鐘模塊維持原有的時(shí)鐘走時(shí)。其中,時(shí)碼倒換器輸出后的時(shí)鐘信號作為主時(shí)鐘信號,經(jīng)過分配后送至各個(gè)業(yè)務(wù)系統(tǒng)使用。B路時(shí)鐘輸出后先進(jìn)行分配,一路進(jìn)入時(shí)碼倒換器,其它的分配輸出作為備路時(shí)鐘信號送往各業(yè)務(wù)系統(tǒng)使用。
時(shí)鐘系統(tǒng)改造完成后,播出系統(tǒng)時(shí)鐘形成了3級防跳變的機(jī)制確保授時(shí)系統(tǒng)的穩(wěn)定可靠。其中第一級防跳變位于外來時(shí)鐘信號源端,采用時(shí)鐘自帶的高穩(wěn)鐘模塊,在外部時(shí)鐘發(fā)生跳變或丟失的情況下,可通過自身的穩(wěn)定時(shí)鐘源對外輸出時(shí)鐘信號。第二級防跳變系統(tǒng)位于時(shí)鐘服務(wù)器中,時(shí)鐘服務(wù)軟件在接收外來串口時(shí)鐘信號后轉(zhuǎn)換為NTP信號對外發(fā)布,同時(shí)也會(huì)校準(zhǔn)操作系統(tǒng)本地時(shí)鐘。如果時(shí)鐘服務(wù)軟件檢測到外來時(shí)鐘信號發(fā)生跳變,則會(huì)拒絕同步外來信號,而采用操作系統(tǒng)時(shí)鐘作為時(shí)鐘源進(jìn)行時(shí)鐘信號的對外發(fā)布。第三級防跳變位于播控工作站端,通常情況下播控軟件直接同步時(shí)鐘服務(wù)器發(fā)出的NTP時(shí)鐘信號,如果播控軟件檢測到時(shí)鐘服務(wù)器的時(shí)鐘發(fā)生異常,則不會(huì)同步該網(wǎng)絡(luò)時(shí)鐘信號,而采用播控工作站本地時(shí)鐘信號作為相關(guān)業(yè)務(wù)的基準(zhǔn)時(shí)鐘信號。
系統(tǒng)更換的兩臺北斗/GPS雙模時(shí)鐘和時(shí)碼倒換器都有RS-232串口輸出16進(jìn)制時(shí)鐘信號,具體信號格式為:波特率9600bps,8位數(shù)據(jù),1位停止位,無校驗(yàn),整秒發(fā)送,依次為同步字(AAH)、00H、00H、百年、年、月、日、星期、時(shí)、分、秒、03H。時(shí)鐘采集服務(wù)器通過實(shí)時(shí)采集多路RS-232串口時(shí)鐘信號進(jìn)行分析比對,即可判斷出異常的時(shí)鐘信號節(jié)點(diǎn)。
實(shí)際實(shí)施過程中,采用了一臺安裝了Windows 7操作系統(tǒng)和.NET Framework 3.5運(yùn)行環(huán)境的工控機(jī)作為時(shí)鐘采集、比對預(yù)警服務(wù)器,在其空余的PCI插槽中插入了一塊4路的MOXA多串口卡,并將MOXA卡的模式設(shè)為RS-232,通過3條串口線分別將兩臺北斗/GPS雙模時(shí)鐘和時(shí)鐘倒換器的RS-232輸出口與MOXA卡的RS-232輸入口相連,用于采集實(shí)時(shí)的時(shí)鐘信號。時(shí)鐘監(jiān)測報(bào)警軟件對于采集的各個(gè)來源的時(shí)鐘信號進(jìn)行實(shí)時(shí)解析轉(zhuǎn)換,并進(jìn)行橫向與縱向雙重比對。如果比對結(jié)果為時(shí)鐘系統(tǒng)出現(xiàn)異常,則會(huì)自動(dòng)觸發(fā)預(yù)警模塊,進(jìn)行語音報(bào)警提醒以及發(fā)送微信消息提醒。橫向?qū)Ρ戎傅氖侨齻€(gè)不同來源之間的時(shí)鐘進(jìn)行相互比對,如果有一路時(shí)鐘信號與其他兩路時(shí)鐘信號之間的差值超過設(shè)定范圍,則該路信號為異常信號。而縱向?qū)Ρ戎傅氖敲恳宦窌r(shí)鐘信號在當(dāng)前時(shí)間取值與其上一秒的時(shí)間取值的差值是否超過設(shè)定的范圍(目前的配置為1秒),如果差值超過1秒,則該路信號為異常信號。
時(shí)鐘報(bào)警檢測軟件為整個(gè)時(shí)鐘跳變預(yù)警發(fā)布系統(tǒng)中的核心軟件,時(shí)鐘監(jiān)測報(bào)警軟件界面如圖3所示。該軟件負(fù)責(zé)處理采集多來源的時(shí)鐘信號,實(shí)時(shí)比對相關(guān)信號,將出現(xiàn)異常的信號及時(shí)發(fā)布預(yù)警信息。軟件在設(shè)計(jì)時(shí)考慮到系統(tǒng)兼容性,對不同廠家的時(shí)鐘產(chǎn)品如青島時(shí)鐘(波特率4800)、廣電時(shí)通(波特率9600)等進(jìn)行適配,將端口、波特率作為可配置選項(xiàng),時(shí)鐘監(jiān)測報(bào)警軟件配置如圖4所示。整個(gè)軟件由3個(gè)模塊組成,分別為時(shí)鐘信號采集處理模塊、時(shí)鐘信號比對模塊、時(shí)鐘信號異常報(bào)警發(fā)布模塊。以下將對這3個(gè)模塊進(jìn)行具體的介紹。
圖3 時(shí)鐘監(jiān)測報(bào)警軟件界面
圖4 時(shí)鐘監(jiān)測報(bào)警軟件配置
4.1 時(shí)鐘信號采集處理模塊
時(shí)鐘監(jiān)測報(bào)警軟件采用了C#中的SerialPort類實(shí)現(xiàn)了RS-232串口通信。時(shí)鐘信號的采集處理主要分為兩個(gè)步驟:第一步是檢測串口是否存在,以及對應(yīng)的端口是否打開;第二步是實(shí)時(shí)讀取串口中傳輸?shù)?進(jìn)制信號,并根據(jù)對應(yīng)型號時(shí)鐘的編碼方式將其轉(zhuǎn)換為16進(jìn)制可讀信號,并取出其中的時(shí)鐘信息。
第一步的檢測端口并初始化的部分代碼如下:
sp1 = new SerialPort();
LogClass.WriteLog(quot;checkClockquot;, quot;nTimeCode1- nTimeCode2 = quot; + Math.Abs(nTimeCode1- nTimeCode2).ToString() + quot;nTimeCode2 -nTimeCode3=quot; + Math.Abs(nTimeCode2 -nTimeCode3).ToString());
}
縱向?qū)Ρ戎傅氖敲恳宦窌r(shí)鐘信號在當(dāng)前時(shí)間取值與其上一秒的時(shí)間取值的差值是否超過1秒,如果差值超過1秒,則該路信號為異常信號。
縱向比對部分代碼:
//計(jì)算當(dāng)前時(shí)間取值與其上一秒的時(shí)間取值的差值if (((nTime1 - nOldTime1) gt; maxOffset) amp;amp; ((nTime1- nOldTime1)!=41))
{
errCount++;
e++;
alarmMsg1 = quot;【quot; + groupBox1.Text + quot;】發(fā)生跳變!quot;;
LogClass.WriteLog(quot;checkClockquot;, quot;【時(shí)鐘源-1】發(fā)生跳變!old:quot; + nOldTime1.ToString() + quot;,now:quot; +nTime1.ToString());
}
4.3 時(shí)鐘信號異常報(bào)警發(fā)布模塊
時(shí)鐘比對模塊在檢測到時(shí)鐘信號出現(xiàn)丟失或跳變等異常情況后,會(huì)自動(dòng)進(jìn)行語音報(bào)警,提醒值班人員加以關(guān)注;發(fā)送微信消息提醒,有利于各環(huán)節(jié)人員及時(shí)掌握相關(guān)情況。在軟件設(shè)計(jì)時(shí),考慮到對時(shí)鐘信號的采集、處理、比對和相關(guān)報(bào)警信息發(fā)布為相互獨(dú)立的模塊,因此采用多線程的方法,將報(bào)警發(fā)布模塊單獨(dú)開啟一個(gè)線程進(jìn)行獨(dú)立處理。采用多線程的方式既明晰了軟件的系統(tǒng)結(jié)構(gòu),同時(shí)減輕了單線程處理任務(wù)的壓力。
此外,由于時(shí)鐘信號出現(xiàn)異常時(shí)可能會(huì)同時(shí)出發(fā)多種不同類型報(bào)警信息,如果這些報(bào)警信息同時(shí)發(fā)送會(huì)引發(fā)沖突,為了解決有可能引發(fā)沖突的問題,在軟件中采用隊(duì)列的方式,將報(bào)警信息進(jìn)行收集排序來避免沖突的發(fā)生。部分代碼如下:
private void sendAlarm(string msg)
{
writeLog(msg);
pt = new playTask(msg, quot;90quot;, quot;-1quot;);
myQueue.Enqueue(pt);
}
語音提醒調(diào)用SpeechSynthesizer類實(shí)現(xiàn),部分代碼如下:
System.Speech.Synthesis.SpeechSynthesizer sp = new
System.Speech.Synthesis.SpeechSynthesizer();
sp.SetOutputToDefaultAudioDevice();
sp.Volume = volume;
sp.Rate = speed;
sp.Speak(alarmText);
LogClass.WriteLog(quot;alarmLogquot;, quot;成功播放報(bào)警:quot; +
alarmText);
sp.Dispose();
發(fā)送微信消息采用的是調(diào)用微信公眾平臺提供的發(fā)送消息接口實(shí)現(xiàn)的,圖5是時(shí)鐘源異常微信消息報(bào)警推送截屏,其代碼如下:
string postData;
postData = quot;clientID=szjkamp;sourceID=時(shí)鐘監(jiān)控amp;alarmType=quot; + alarmType + quot;amp;channelName=quot; +strChnName + quot;amp;msg=quot; + msg;
string url = Settings1.Default.WXMsgAddress.ToString();
CookieContainer cc = new CookieContainer(); //接收緩存
b y t e[] b y t e A r r a y = E n c o d i n g.U T F 8.GetBytes(postData); // 轉(zhuǎn)化
HttpWebRequest webRequest2 = (HttpWebRequest)WebRequest.Create(url); //新建一個(gè)WebRequest對象用來請求或者響應(yīng)url
webRequest2.CookieContainer=cc; //保 存cookie
webRequest2.Method=quot;POSTquot;; //請求方式是POST
webRequest2.Referer = url;
webRequest2.ContentType = quot;application/x-wwwform-urlencodedquot;; //請求的內(nèi)容格式為application/x-www-form-urlencoded
webRequest2.ContentLength = byteArray.Length;
Stream newStream = webRequest2.GetRequestStream();
//返回用于將數(shù)據(jù)寫入 Internet 資源的 Stream。
// Send the data.
newStream.Write(byteArray, 0, byteArray.Length);//寫入?yún)?shù)
newStream.Close();
HttpWebResponse response2 = (HttpWebResponse)webRequest2.GetResponse();
StreamReader sr2 = new StreamReader(response2.GetResponseStream(), Encoding.Default);
string sendResult = sr2.ReadToEnd();
LogClass.WriteLog(quot;sendWXAlarmquot;, sendResult + quot;:quot;+ msg);
圖5 時(shí)鐘源異常微信消息報(bào)警推送
以上是對江蘇廣電總臺時(shí)鐘跳變預(yù)警發(fā)布系統(tǒng)的設(shè)計(jì)原理、系統(tǒng)構(gòu)成的簡要介紹。本系統(tǒng)的上線使用,很好的彌補(bǔ)了我臺對于時(shí)鐘出現(xiàn)異常時(shí)監(jiān)測能力不足的問題。該系統(tǒng)能有效幫助值班人員在第一時(shí)間發(fā)現(xiàn)時(shí)鐘系統(tǒng)的異常情況,極大的提升了臺內(nèi)統(tǒng)一時(shí)鐘系統(tǒng)的安播保障水平。目前該系統(tǒng)還是簡單的對時(shí)鐘信號源進(jìn)行監(jiān)測,未來可對該系統(tǒng)進(jìn)行相關(guān)擴(kuò)展,臺內(nèi)全鏈路的時(shí)鐘信號節(jié)點(diǎn)都可納入整個(gè)預(yù)警發(fā)布平臺,構(gòu)建出一套全臺的時(shí)鐘監(jiān)控預(yù)警平臺。我臺時(shí)鐘跳變預(yù)警發(fā)布系統(tǒng)作為電視臺時(shí)鐘異常監(jiān)測的一個(gè)案例,希望能夠?yàn)閺V電行業(yè)內(nèi)的時(shí)鐘異常監(jiān)測管理提供借鑒和幫助。