組態軟體開發
最近研究行車綜合自動化系統,總結並分享下組態軟體開發的一些心得:
1、一般組態軟體分開發模式與執行模式:1)開發模式與執行模式可以在同一程式中實現,通過配置的不同來進行區分;2)開發模式與執行模式由不同的程式實現——開發模式在控制項組裝的過程中將執行時的**寫入檔案,執行模式時,將開發模式寫入的**編譯生成可執行檔案執行。
2、組態軟體各元件的生成:1)元件由多個不同的形態構成,每個形態代表裝置不同的狀態,如軌道區段的占用、出清分別用不同的形態表示,每個形態對應乙個狀態屬性值,在執行過程中根據傳入狀態屬性值的不同,顯示該控制項不同的形態;2)元件由多個元素疊加而成,各元素在不同狀態可設定不同顏色,根據傳入的裝置狀態及邏輯條件判斷當前應顯示的形態。
3、通訊方式:1)乙太網;2)通用串列埠;3)opc等。主要總結socket通訊:
socket通訊:採用open-write/read-close模式,用於網路中程序間通訊
為了在應用程式當中呼叫任何乙個winsock api函式,首先第一件事情就是必須通過wsastartup函式完成對winsock服務的初始化,因此需要呼叫wsastartup函式。wsastartup,即wsa(windows sockets asynchronous,windows非同步套接字)的啟動命令,應用程式或dll呼叫的第乙個windows sockets函式。
int wsastartup
(word wversionrequested,
lpwsadata lpwsadata );
網路程序間通訊需要唯一標示乙個程序,本地可通過程序pid來唯一標示乙個程序,網路中使用tcp/ip協議族,網路層「ip位址」可唯一標示網路中的主機,傳輸層的「協議+埠」可唯一標示主機中的應用程式即程序,利用ip位址、協議、埠號即可作為網路中程序的唯一標示,與其他程序進行互動。
首先建立乙個socket描述符,唯一標示乙個socket,作為引數進行讀寫操作。
int socket
(int domain, int type, int protocol)
;//domain:協議域af_inet、af_inet6、af_local(或稱af_unix,unix域socket)、af_route等,
//決定了socket的位址型別,在通訊中必須採用對應的位址,如af_inet決定了要用ipv4位址(32位的)與埠號(16位的)的組合
//type:socket型別sock_stream、sock_dgram、sock_raw、sock_packet、sock_seqpacket等
//protocol:協議ipproto_tcp、ipptoto_udp、ipproto_sctp、ipproto_tipc等
然後,將乙個位址族中的特定位址付給socket。例如對應af_inet、af_inet6就是把乙個ipv4或ipv6位址和埠號組合賦給socket。
int bind
(int sockfd,
const struct sockaddr *addr, socklen_t addrlen)
;//sockfd:即socket描述字,它是通過socket()函式建立了,唯一標識乙個socket。bind()函式就是將給這個描述字繫結乙個名字。
//這個位址結構根據位址建立socket時的位址協議族的不同而不同,
//如ipv4對應的是:
struct sockaddr_in
;/* internet address. */
struct in_addr
;
通常伺服器在啟動時會繫結乙個位址(ip+埠號),用於提供服務,客戶端可通過該位址來連線伺服器,客戶端則由系統自動分配埠號並與自身ip位址組合,故通常伺服器在listen前需呼叫bind(),而客戶端則不需要,在connect()時由系統隨機生成。
作為伺服器,在呼叫socket()、bind()之後,呼叫listen()來監聽socket,若客戶端呼叫connect()發出連線請求,伺服器端即可接收到該請求。
int listen
(int sockfd, int backlog)
;//listen函式的第乙個引數即為要監聽的socket描述字,第二個引數為相應socket可以排隊的最大連線個數。
int connect
(int sockfd,
const struct sockaddr *addr, socklen_t addrlen)
;//connect函式的第乙個引數即為客戶端的socket描述字,第二引數為伺服器的socket位址,第三個引數為socket位址的長度。
//客戶端通過呼叫connect函式來建立與tcp伺服器的連線。
tcp伺服器監聽到客戶端的連線請求之後,呼叫accept()函式接收請求,這樣連線就建立好了。之後就可以開始網路i/o操作了。
int accept
(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
;//accept函式的第乙個引數為伺服器的socket描述字(監聽socket描述字),
//第二個引數為指向struct sockaddr *的指標,用於返回客戶端的協議位址,
//第三個引數為協議位址的長度。
//如果accpet成功,那麼其返回值是由核心自動生成的乙個全新的描述字(已連線的socket描述字),代表與返回客戶的tcp連線。
乙個伺服器通常通常僅僅只建立乙個監聽socket描述字,它在該伺服器的生命週期內一直存在。核心為每個由伺服器程序接受的客戶連線建立了乙個已連線socket描述字,當伺服器完成了對某個客戶的服務,相應的已連線socket描述字就被關閉。
伺服器與客戶建立好連線後,可以呼叫網路i/o進行讀寫操作了,即實現了網路中不同程序之間的通訊,網路i/o操作如下:
#include
ssize_t read
(int fd,
void
*buf, size_t count)
; ssize_t write
(int fd,
const
void
*buf, size_t count)
; #include
#include
ssize_t send
(int sockfd,
const
void
*buf, size_t len, int flags)
; ssize_t recv
(int sockfd,
void
*buf, size_t len, int flags)
; ssize_t sendto
(int sockfd,
const
void
*buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen)
; ssize_t recvfrom
(int sockfd,
void
*buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen)
; ssize_t sendmsg
(int sockfd,
const struct msghdr *msg, int flags)
; ssize_t recvmsg
(int sockfd, struct msghdr *msg, int flags)
;//read函式是負責從fd中讀取內容.當讀成功時,read返回實際所讀的位元組數,
//如果返回的值是0表示已經讀到檔案的結束了,小於0表示出現了錯誤。
//write函式將buf中的nbytes位元組內容寫入檔案描述符fd.成功時返回寫的位元組數。失敗時返回-1,並設定errno變數。
讀寫操作完成後就要關閉相應的socket描述字,close操作只是使相應socket描述字的引用計數-1,只有當引用計數為0的時候,才會觸發tcp客戶端向伺服器傳送終止連線請求。
int close
(int fd)
;
tcp三次握手建立連線:
當客戶端呼叫connect時,觸發了連線請求,向伺服器傳送了syn j包,這時connect進入阻塞狀態;伺服器監聽到連線請求,即收到syn j包,呼叫accept函式接收請求向客戶端傳送syn k ,ack j+1,這時accept進入阻塞狀態;客戶端收到伺服器的syn k ,ack j+1之後,這時connect返回,並對syn k進行確認;伺服器收到ack k+1時,accept返回,至此三次握手完畢,連線建立。客戶端的connect在三次握手的第二個次返回,而伺服器端的accept在三次握手的第三次返回。
組態軟體開發(僅限後台部分)
2005年03月11日 13 09 00 目前我僅考慮組態後台開發的有關問題 我認為乙個標準的組態後台程式應具備如下幾個能力。1 提供驅動介面,可以方便的擴充 或編寫 驅動程式 2 提供標準dde介面 dde server dde client 3 提供標準opc介面 opc server opc ...
組態軟體開發(僅限後台部分)
目前我僅考慮組態後台開發的有關問題 我認為乙個標準的組態後台程式應具備如下幾個能力。1 提供驅動介面,可以方便的擴充 或編寫 驅動程式 2 提供標準dde介面 dde server dde client 3 提供標準opc介面 opc server opc client 4 提供指令碼編輯環境,對變...
適合python組態軟體 組態軟體哪個好
裝置驅動 紫金橋realhistorian常用硬體種類常用型號支援 亞控組態王kingscada種類非常多,支援大量硬體型號 傑控fame主要集中在主要的幾家國外廠家和閘道器等相關裝置範圍比較小 歷史儲存 紫金橋realhistorian.週期和變化儲存兩種方式 亞控組態王kingscada.無 力...