移動(dòng)端
方案網(wǎng)小程序
方案網(wǎng)手機(jī)端
加小編微信入群
發(fā)布成功
項(xiàng)目任務(wù)是在一塊由STC12C5A控制的,帶有12個(gè)繼電器輸出和18個(gè)輸入的控制板上, 開發(fā):
通過485通信的協(xié)議控制繼電器吸合和斷開的軟件(需求和協(xié)議已規(guī)劃和整理好)
通過485通信的協(xié)議可以修改12個(gè)繼電器輸出和18個(gè)輸入的對(duì)應(yīng)關(guān)系,例如1對(duì)1或者1對(duì)1、2、18,2對(duì)2、17,這樣原本按1對(duì)應(yīng)1輸出可以修改為1、2、18輸出
具體需求稍后上傳
開發(fā)目標(biāo)
在發(fā)包方提供的基于STC12C5A16S2的繼電器板上開發(fā)軟件
發(fā)包方提供材料清單
STC12C5A16S2單片機(jī)資料
繼電器板
繼電器板的原理圖
大致功能要求
1. 通過485接口發(fā)送私有協(xié)議可以讀取輸入(開關(guān)量和觸點(diǎn)輸入)和輸出(繼電器)的狀態(tài).
2. 輸入支持開關(guān)量和觸點(diǎn)輸入
3. 有輸入時(shí)可以根據(jù)對(duì)應(yīng)關(guān)系在輸出端輸出
4. 通過485接口發(fā)送私有協(xié)議可以更改輸入對(duì)應(yīng)輸出的對(duì)應(yīng)關(guān)系
5. 要求全面引入STC的加密功能, 使燒入的程序不能被破解
6. 發(fā)包方可以發(fā)布某一個(gè)或一串STC ID適用的燒入目標(biāo)程序或包含目標(biāo)程序的EXE發(fā)布給客戶使用而不被破解. 而且這個(gè)可以讓發(fā)包方選擇這個(gè)EXE是否可以僅在首次運(yùn)行的這一臺(tái)PC上運(yùn)行還是可以在任意多臺(tái)PC機(jī)上運(yùn)行.
實(shí)現(xiàn)方式
通過一張鏈表來實(shí)現(xiàn), 這張表是一張二維表, 最上面橫向是輸入序列,最左邊縱向是輸出序列, 準(zhǔn)備通過它們的對(duì)應(yīng)關(guān)系來控制輸入和輸出的對(duì)應(yīng).
所有的輸入和輸出狀態(tài),以及端口的配置數(shù)據(jù)全部存在這張表中.
輸入和輸出的對(duì)應(yīng)關(guān)系需要條件和參數(shù)傳遞,應(yīng)此通過這個(gè)表的IF(條件)和Select(參數(shù))鏈接到另2個(gè)表中
表的具體內(nèi)容請(qǐng)看目錄下文件:”鏈表.xlsx”
程序的模塊組成
計(jì)劃將該程序分為:
1. 輸入輸出狀態(tài)讀取和控制模塊
這個(gè)模塊負(fù)責(zé)處理通過485接口發(fā)送和接收的輸入輸出狀態(tài)讀取和控制相關(guān)的協(xié)議,以及根據(jù)協(xié)議讀取輸入和輸出狀態(tài)控制輸出的功能.
2. 輸入檢測模塊
這個(gè)模塊負(fù)責(zé)處理輸入, 它根據(jù)一個(gè)可以調(diào)整檢測周期的協(xié)議修改后的周期參數(shù),來周期性的檢測輸入
具體實(shí)現(xiàn):
1.定義一個(gè)InterfaceCheckTime變量,用于提供輸入處理模塊用于檢測外部接口的循環(huán)周期,InterfaceCheckTime變量的值來源于表的2JKLM
2.為每一個(gè)輸入定義二個(gè)變量,一個(gè)叫InxN一個(gè)叫InxP,其中X是輸入號(hào),InxN用于存儲(chǔ)輸入的當(dāng)前值,InxP用于存儲(chǔ)輸入之前一個(gè)監(jiān)測周期監(jiān)測的值,InxN和InxP的初始值來源于表的4JKLM,表的初始值始終為0和0,程序運(yùn)行中InxN和InxP變量的值存在RAM中斷電丟失,而不是和表一樣放在EPROM中.
3.為每一個(gè)輸入定義一個(gè)變量:InxED,它只有兩個(gè)值0/1表示打開和關(guān)閉,其中X是輸入號(hào)。
DEL
6.為每一個(gè)輸入設(shè)置一個(gè)變量:InXsc,它只有兩個(gè)值0/1表示開關(guān)量輸入和觸點(diǎn)輸入,其中X是輸入號(hào)。
7.為每一個(gè)輸入設(shè)置一個(gè)變量:InXs,它只有兩個(gè)值0/1表示開關(guān)量輸入是低電平觸發(fā)還是高電平觸發(fā)。
8.為每一個(gè)輸入設(shè)置一個(gè)變量:InXc,它只有兩個(gè)值0/1表示觸點(diǎn)輸入是前沿觸發(fā)還是后沿觸發(fā)。
DEL
程序流程:
1.InputCheckTime變量定義的定時(shí)器到時(shí)了嗎?到了開始讀端口高低電平0/1,同時(shí)將InputCheckTime重置為2JKLM的值開始遞減;沒到時(shí)不執(zhí)行繼續(xù)跳到外部讓其他程序執(zhí)行.
2.進(jìn)入讀取18個(gè)輸入端口的循環(huán),首先看這個(gè)端口的InxED值是否為1(x是端口號(hào)),為1說明端口打開,那么就將該端口InXn的值賦予InXp,將這個(gè)周期讀取的輸入寄存器數(shù)據(jù)賦予InXn,而InxED值是否為0(x是端口號(hào))的說明端口關(guān)閉了,不用讀取它的值
3.直到把全部18個(gè)輸入端口的值讀取完畢跳出循環(huán)
3. 輸入確認(rèn)和對(duì)應(yīng)輸出執(zhí)行模塊
這個(gè)模塊根據(jù)輸入檢測模塊提供的數(shù)據(jù)判斷是否有輸入, 再根據(jù)輸入的條件判斷是否滿足, 然后執(zhí)行select選擇的輸出,并根據(jù)參數(shù)執(zhí)行相應(yīng)的延遲和延遲關(guān)閉.
具體實(shí)現(xiàn):
1.設(shè)置一個(gè)循環(huán)來處理所有18個(gè)輸入的處理
2.檢查每個(gè)輸入的InxN和InxP是否不同,不同說明于之前的狀態(tài)不同意味著該輸入端口有輸入
3.然后讀取InxST的值,看接口是被定義為開關(guān)還是觸點(diǎn)輸入類型
4.如果是開關(guān)量的,取出InxN的值,看它是1=高電頻還是0=低電頻,如果是1就執(zhí)行J這一列的操作,如果是0就執(zhí)行K這一列的操作
5.操作步驟:1.首先讀取IF里的條件要求,看看是否滿足條件(IF條件的處理方式請(qǐng)看IF表單),如果不滿足就不執(zhí)行,如果滿足執(zhí)行表格中對(duì)應(yīng)的左邊的輸出項(xiàng)目,并攜帶Select參數(shù)執(zhí)行,執(zhí)行前判斷相應(yīng)行的IF條件是否滿足.
4. 鏈表
見目錄
5. 鏈表配置協(xié)議
再議
1、我愛方案網(wǎng)是會(huì)員制服務(wù),服務(wù)商通過競標(biāo)后即可聯(lián)系雇主;
2、項(xiàng)目預(yù)算與報(bào)價(jià)不代表最終成交價(jià)格,成交價(jià)以雙方協(xié)商為準(zhǔn);
3、平臺(tái)提供設(shè)計(jì)項(xiàng)目對(duì)接服務(wù),希望促成高效合作,對(duì)交易雙方不收取傭金,謝謝留意!