在线观看国产中文字幕/国产好大好紧好爽好湿视频唱戏/最近中文高清字幕免费/今天高清在线播放

 
 
資料名稱 IF3報鐘器C版公共接口程序(TXT文本方式)備驅動-有數量有匙牌
更新時間 2013-9-14 16:02:27
下載地址
http://pan.baidu.com/share/link?shareid=3158305806&uk=624116759
資料說明
刷卡報鐘系統用到了2個接口程序,一個是我公司開發的底層接口程序:fst _sn_card_data.exe,他負責完成和室內刷卡器的底層接口,(下稱公共接口程序,窗口標題是“桑拿刷卡器公共接口”),一個是合作軟件公司依據自己軟件開發的上層接口程序,(下稱私有接口程序,窗口標題是“桑拿數據處理程序”)。
公共接口程序完成了對刷卡器發來數據的解包,并以文本文件“接口.TXT”保存信息內容,然后向私有接口程序,也就是窗口標題是“桑拿數據處理程序”的程序發送一條標號是1088的通知消息,然后一直等待。私有接口程序收到這個通知消息后,打開“接口.TXT”文件,依據其中內容,完成對應的操作,比如技師起鐘等,然后將操作結果,寫會“接口.TXT”文件,并向公共接口程序發送一條標號是1088,lParam是2的通知消息。公共接口程序收到該通知消息后,從“接口.txt”里提取返回信息,然后返回給室內刷卡器,并刪除“接口.TXT”文件。
工作流程圖如下:                    
 
 
 
 
 
 
 
 
 
 
1、編寫私有接口程序需要做的是:
a)    不停檢測是否收到1088號消息,如果收到,就打開“接口.TXT”文件。
b)    從“接口.TXT”文件讀取數據,然后按照要求執行對應的操作,然后將返回結果,增加到這個文件的尾部。
c)    保存“接口.TXT”文件,退出對這個文件的占用。
d)    向“桑拿刷卡器公共接口”程序,也就是fst _sn_card_data.exe發送編號是1088的系統消息,并且消息的lParam參數是2,就可以了。
2、“接口.TXT”文件文件結構
例子格式如下:
串口號:1
設備號:1
命令內容:安排技師-撤鐘;客人卡號:0000106496;部長卡號:0000106496
其中第一行是:串口號:1
第二行是:設備號:1
在實際施工中,通過串口擴展卡,一個PCI插槽可以擴展8個串口,每個串口最多可以連接32個房間。
客戶應該在自己的系統中建立房間與串口號和設備號的對應關系。
這樣通過串口號,和設備號,軟件就可以得到是哪個房間發送的信息了。
第三行是:命令內容:
不同的命令,內容格式不一樣。
3、命令內容的詳細格式:
1、  起鐘:
命令內容:起鐘;技師卡號:0008712735
2、  加鐘:
命令內容:加鐘;技師卡號:0008712735
3、  出鐘:
命令內容:出鐘;技師卡號:0008712735
4、  應鐘:
命令內容:應鐘;技師卡號:0008712735
等等
例如:催鐘的實現方法:
刷卡器操作命令是由刷卡器操作,向電腦發送操作命令,公共接口程序接收生成“接口.TXT”文件,私有接口程序處理數據,然后返回操作結果給公共接口程序,公共接口程序發送給刷卡器。
文件內容如下:
格式一、
串口號:1
設備號:1
催鐘:004,005
這樣,報鐘器就會發出“技師004 005已經到鐘”的聲音
格式二、
串口號:1
設備號:1
催鐘[5]:004,005
這樣,報鐘器就會發出“技師004 005 5分鐘以后到鐘”的聲音
5、私有接口程序可以向“接口.TXT”寫入的信息:
1、 起鐘:
語音提示,請刷技師卡,
操作回復:
A、  起鐘成功
B、  房間錯誤
C、  鐘房沒有安排
D、  已經起鐘
E、  技師卡錯誤
完成技師開始計鐘的功能,具體的操作流程按程序設計的不同而不同,詳見設備實際操作菜單。
2、 加鐘:
語音提示,請刷技師卡
操作回復:
A、  加鐘成功
B、  房間錯誤
C、  沒有起鐘
D、  技師卡錯誤
完成客人對技師的續鐘要求。
3、  出鐘:
語音提示,請刷技師卡,
操作回復:
A、  出鐘成功
B、  房間錯誤
C、  沒有起鐘
D、  技師卡錯誤
結束技師的上鐘,并生成客人消費記錄和技師的提成記錄。
4、  應鐘:
語音提示,請刷技師卡,
操作回復;
A、  應鐘成功
B、  鐘房沒有安排
C、  技師卡錯誤
對技師安排以后,技師進行響應。
5、  服務:
語音提示,服務代碼--請刷技師卡,
操作恢復:
A、  服務成功
B、  房間錯誤
C、  沒有起鐘
D、  技師卡錯誤
向服務臺發送需要指定服務的求助信息。比如送免費飲料等。
6、  小費,
語音提示:金額---請刷技師卡
操作回復
A、  小費成功
B、  沒有上鐘
C、  技師卡錯誤
技師自行錄入消費,可以防止小費跑單。
7、  商品,
語音提示:商品編號---請刷技師卡
操作回復:
A、  商品成功
B、  沒有上鐘
C、  技師卡錯誤
D、  商品編號錯誤
在上鐘過程中,客人的消費錄入,可以打印單據到吧臺等地方,并記錄技師的提成信息。
服務員[部長]功能界面操作:包括輪鐘、點鐘、括鐘、選鐘和撤消對技師安排,并把信息通過打印機、語音、顯示屏幕、電腦顯示屏來通知給技師房。
8、  輪鐘
語音提示:模式編號---技師編號—請刷客人卡
操作回復
A、  101號技師安排成功
B、  該技師不是排鐘狀態
C、  部長卡錯誤
D、  模式錯誤
E、  客人卡錯誤
9、  點鐘
語音提示:模式編號---技師編號—請刷客人卡
操作回復:
A、  101號技師安排成功
B、  該技師不是排鐘狀態
C、  部長卡錯誤
D、  模式編號錯誤
E、  客人卡錯誤
10、括鐘
語音提示:模式編號---技師編號—請刷客人卡
操作回復:
A、  101號技師安排成功
B、  該技師不是排鐘狀態
C、  部長卡錯誤
D、  模式編號錯誤
E、  客人卡錯誤
11、選種
語音提示:模式編號---技師編號—請刷客人卡
操作回復:
A、  101號技師安排成功
B、  該技師不是排鐘狀態
C、  部長卡錯誤
D、  模式編號錯誤
E、  客人卡錯誤
12、撤鐘
語音提示:請刷客人卡
操作回復:
A、  撤鐘成功
B、  沒有安排
C、  客人卡錯誤
D、  部長卡錯誤
13、退技師
語音提示:請刷客人卡
操作回復
A、  退技師成功
B、  沒有安排
C、  客人卡錯誤
D、  部長卡錯誤
14、換房間
語音提示:請刷客人卡
操作回復:
A、  換房間成功
B、  客人卡錯誤
C、  部長卡錯誤
15、換模式
語音提示:模式編號,請刷客人卡
操作回復
A、  換模式成功,當前模式101
B、  客人卡錯誤
C、  部長卡錯誤
D、  模式號錯誤
E、  沒有安排技師
16、商品
語音提示:商品編號---請刷客人卡
操作回復:
A、  商品成功
B、  客人卡錯誤
C、  部長卡錯誤
D、  商品編號錯誤
給客人錄入商品消費,并自動打印單據到吧臺等地方
*、贈送
語音提示:商品編號---請刷客人卡
操作回復:
E、  商品成功
F、  客人卡錯誤
G、  部長卡錯誤
H、  商品編號錯誤
贈送客人的商品消費錄入,并自動打印單據到吧臺等地方。
0、  詢技師排鐘
語音提示:技師類別編號
操作恢復:
               i.      101 102
              ii.      技師類別編號錯誤
            iii.      部長卡錯誤
11、  查詢技師
語音提示:技師編號---請刷客人卡
操作恢復:
I、  101號技師,203房間,模式101,5分鐘后出鐘
J、  部長卡錯誤
K、  技師編號錯誤
17、買單
語音提示:請刷客人卡
操作恢復:
A、  當前消費金額50元
語音:是否結帳?---人民幣結還是貴賓卡結帳
B、  結帳成功
6、私有接口程序可以向“接口.TXT”本接口可以接受的返回消息是固定的,可以接收以下消息:
起鐘成功
加鐘成功
小費成功
錯誤技師卡
已經起鐘
房間錯誤
出鐘成功
應鐘成功
服務成功
沒有起鐘
錯誤部長卡
錯誤客人卡
錯誤模式編號
錯誤商品編號
錯誤技師編號
排鐘成功
點鐘成功
選鐘成功
括鐘成功
撤鐘成功
退技師成功
更換房間成功
商品成功
贈送成功
錯誤技師類別
二、通信協議:
a)    從刷卡器到PC的數據傳輸協議:
[0x24頭字節][設備號][0x33命令字節][數據長度][數據,長度=命令長度字節][校驗位,從第2位到數據加總][0x2A尾部][發送次數]
b)    從PC到刷卡器的數據傳輸協議:
[0x24][設備號][0x22 命令字節][數據長度][數據][校驗位][0x2A結尾]
三、設備的地址碼設置
設備“編號房號撥碼開關”在設備正上方“地址”字符位置。設備安裝前,根據每個房間的編號,設置對應的設備地址碼。設備的地址碼開關排列如下圖:
開關位號
1
2
3
4
5
地址碼
1
2
4
8
16
 
 
 
撥碼開關的地址碼定義如上表(地址碼撥到OFF有效
撥碼開關方式:采用地址碼累加方式定義,全部撥到“ON”為“0”號地址,全部撥到“OFF”狀態為“31”號設備。例如:如要設置設備為18號,設置方式:把撥碼開關第2位和第5位撥到OFF狀態,第1、3、4位撥到ON狀態即可。設備重新設置地址碼后,必須重新上電或復位后才生效。
 
四、接口程序中“配置文件.ini”的設置
1、打開接口程序文件夾中的“配置文件.ini”,找到
波特率=
正確修改波特率。比如電腦直接接第三代、第四代報鐘器,應該設置成:
波特率=2400
保存該文件。
2、  打開接口程序文件夾中的“配置文件.ini”,找到
串口端口=
檢查連接設備的串口號,如果使用COM1進行和報鐘器通信,則設置成:
串口端口= 1
如果有多個串口同時工作,比如COM3,COM4,COM5,則設置成:
串口端口= 3,4,5
3、  檢查當前電腦已經使用了的端口:
在【開始】--【運行】中錄入CMD命令,進入命令操作窗口,執行NETSTAT –AN
紅色部分是你的電腦已經占用了的端口,然后從6000開始找可以使用的端口,比如當前6003,6004是可以使用的。
4、  打開接口程序文件夾中的“配置文件.ini”,找到并設置成
接口程序端口=6003
工作程序端口=6004
5、  將我公司提供的例子程序,編譯,生成可執行文件sn_lcdcard.exe,切記,文件名必須不能改變,而且不能直接運行它。
6、  將該文件sn_lcdcard.exe拷貝到接口程序目錄中,然后運行fst_sn_card_data.exe,你可以系統初始化了你設置的端口,然后看到剛才編譯后生成的sn_lcdcard.exe自動運行了起來。通過雙擊WINDOWS托盤區的【桑拿刷卡器公共接口】圖標,可以打開程序界面,如果看到有初次握手字樣,表示,您剛才的設置時正確的,而且例子接口程序已經基本可以工作了。
7、  試著操作報鐘器的起鐘命令,看看可否工作。
【經驗之談】:
當有多個串口同時工作,建議每個fst_sn_card_data.exe只負責一個串口的數據傳輸。比如有4個串口工作,分別是1、2、3、4,那么可以建立4個文件夾,每個文件夾通過修改配置文件的
串口端口=
接口程序端口=6000
工作程序端口=6001
工作程序名稱=sn_lcdcard.exe
要確保每個文件夾中的端口互相不同,工作程序名稱也不能相同。
可以把端口號按6000~6007排列。
五、第三方軟件公司的接口開發方法
(一) 、客戶寫一個軟件,名字是sn_lcdcard.exe。
(二) 、在主工作窗口放置winsock控件,命名OLE_1。
(三) 、在窗口打開的時候設置OLE_1的如下屬性:
protocol=1             采用UDP方式連接
remotehost='127.0.0.1'    本地電腦通信
localport=6001          本程序使用6001端口
remoteport=6000         接口程序使用6000端口
bind()                  綁定網絡協議
senddata("初次握手")     向接口程序發送握手信息
1、            在WINSOCK控件的dataarrive事件中,通過getdata函數得到從接口程序中傳輸來的內容,進行處理。具體命令內容可以在接口程序界面中看到,也可以從程序路徑的data文件夾下,找到,基本格式如下。
串口號-設備號-命令序號-命令內容
比如:
1-31-0-命令內容:起鐘;上鐘方式:;模式編號:11;技師卡號:0010144830;客人卡號:0010144830
表示COM1上的設備31,第0次發送命令,要求起鐘。
上鐘方式沒有指定。模式編號是11,卡號是0010144830的技師,要給匙牌號是0010144830的客人服務。
以上內容可以通過跟蹤獲得,也可以從接口程序的data文件夾下的跟蹤記錄中獲得。
經過對上述命令進行處理,然后將操作結果按以下格式通過WINSOCK控件的senddata函數返回:串口號:N;設備號:N;返回內容
3、私有接口程序向“公共接口程序”發送數據的方法:
由于私有接口程序可能是由不同的語言編寫的,所以方法會有一定差異。
例如VB:
首先定義以下外部函數:
Public Declare Function PostMessage& Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
然后使用使用FindWindowA函數先找到公共接口程序窗口的指針,然后調用PostMessage來發送信息。
DEPHI:
使用函數PostMessage()來發送信息
例如 PB
先定義外部函數:
FUNCTION ulong FindWindowA(ulong classname,string windowname) LIBRARY "user32.dll"
recheck:
wHandle = FindWindowA(0, "桑拿刷卡器公共接口")
if wHandle > 0 then//程序已經運行
     send(wHandle,1088,0,2)//
else
     goto recheck
end if
5、PB例子代碼
在窗口的OTHER事件中
string handerrorkf,iszd='N'//是否主動發送
long sc,i,czjg
string stype,cznr,jg
long lastxh,whandle
 
if message.number <> 1088 then return
st_1.text=string(now())+"得到數據"+string(message.LongParm)
st_1.setredraw(true)
long filenum
string ss
long commno//串口號
long devno//設備號
long commxh//命令序號
string s_mlnr //命令內容
string mlkey,mldata
filenum=fileopen("接口.txt",linemode!,read!)
//讀入串口號:
fileread(filenum,ss)
commno=long(mid(ss,8))
//設備號
fileread(filenum,ss)
devno=long(mid(ss,8))
//命令內容
fileread(filenum,ss)
fileclose(filenum)
 
s_mlnr=mid(ss,10)
mlkey=left(s_mlnr,pos(s_mlnr,';') - 1)
 
mldata=mid(s_mlnr,pos(s_mlnr,';') + 1)
string kfname
select kfname into :kfname from n_kf where sbno=:devno and comm=:commno;
string cardno
choose case mlkey
     case '起鐘'
         cardno=right(mldata,10)
         wf_qz(cardno,kfname,commxh)
     case '加鐘'
         cardno=right(mldata,10)
         wf_jz_js(cardno,kfname,commxh)
     case '出鐘'
         cardno=right(mldata,10)
         wf_czok(cardno,kfname,commxh)
     case '應鐘'
         cardno=right(mldata,10)
         wf_outroom(cardno,kfname,commxh)
     case '服務'
         wf_server(kfname,commxh,mldata)
     case '小費'
         wf_xf_enter(kfname,commxh,mldata)
     case '安排技師-排鐘'
         wf_needjs(kfname,commxh,mldata,'排鐘')
     case '安排技師-點鐘'
         wf_needjs(kfname,commxh,mldata,'點鐘')
     case '安排技師-選鐘'
         wf_needjs(kfname,commxh,mldata,'選鐘')
     case '安排技師-括鐘'
         wf_needjs(kfname,commxh,mldata,'括鐘')
     case '安排技師-撤鐘'
         wf_needjs_cancel(kfname,commxh,mldata)
     case '退技師'
         wf_change_js(kfname,commxh,mldata)
     case '更換房間'
         wf_change_room(kfname,commxh,mldata)
     case '更換模式'
         wf_change_ms(kfname,commxh,mldata)
     case '技師商品'
         wf_shop(kfname,commxh,mldata,'=')
     case '部長商品'
         wf_shop(kfname,commxh,mldata,'N')
     case '贈送商品'
         wf_shop(kfname,commxh,mldata,'Y')
     case '結帳查詢'
         wf_select_money(kfname,commxh,mldata)
     case '查詢技師排鐘'
         wf_select_jspz(kfname,commxh,mldata)
     case '查詢技師狀態'
         wf_select_jsstate(kfname,commxh,mldata)
end choose
//over: