Halcon通信之socket sock_recv.hdev&sock_send.hdev

引言

使用MFC联合Halcon,将HDevelop中的演示结果用MFC中对话框的形式显示,


一、结果

1.1 Halcon socket_send

在这里插入图片描述

1.2 Halcon socket_recv

在这里插入图片描述

1.3 MFC结合Halcon下socket

在这里插入图片描述

在这里插入图片描述


二、Halcon代码

2.1 sock_recv.hdev

//* Open a socket that accepts connection requests
//* from another HALCON-process
//* (start the program 'sock_send.hdev' in a second HDevelop
//* to see the result)
//* 
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
dev_set_colored (12)
//*Open a socket that accepts connection requests
open_socket_accept (3000, 'protocol', 'HALCON4', AcceptingSocket)
//* Busy wait for an incoming connection
dev_error_var (Error, 1)
dev_set_check ('~give_error')
OpenStatus := 5
while (OpenStatus != 2)
    socket_accept_connect (AcceptingSocket, 'false', Socket)
    OpenStatus := Error
    wait_seconds (0.2)
endwhile
dev_set_check ('give_error')
//* Connection established
get_next_socket_data_type (Socket, DataType)
//* Receive an image over a socket connection
receive_image (Image, Socket)
convert_image_type (Image, ImageInt2, 'int2')
//* Send an image over a socket connection
send_image (ImageInt2, Socket)
receive_image (ImageReal, Socket)
threshold (ImageReal, Region, 0, 63)
send_region (Region, Socket)
receive_region (ConnectedRegions, Socket)
area_center (ConnectedRegions, Area, Row, Column)
send_tuple (Socket, Area)
send_tuple (Socket, Row)
send_tuple (Socket, Column)
receive_tuple (Socket, Colors)
stop ()
//* Continue to close a socket
close_socket (Socket)
close_socket (AcceptingSocket)

2.2 sock_send.hdev

//* Open a socket to an existing socket
//* of another HALCON-process
//* (you must start another HDevelop with the program 'socket_recv.hdev'
//* to see the example work)
//* 
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
dev_set_colored (12)
open_socket_connect ('127.0.0.1', 3000, [], [], Socket)
read_image (Image, 'fabrik')
//* Send an image over a socket connection
send_image (Image, Socket)
//* Receive an image over a socket connection
receive_image (ImageInt2, Socket)
convert_image_type (ImageInt2, ImageReal, 'real')
send_image (ImageReal, Socket)
receive_region (Region, Socket)
connection (Region, ConnectedRegions)
send_region (ConnectedRegions, Socket)
receive_tuple (Socket, Area)
receive_tuple (Socket, Row)
receive_tuple (Socket, Column)
query_all_colors (WindowHandle, Colors)
send_tuple (Socket, Colors)
stop ()
//* Continue to close a socket
close_socket (Socket)

三、解析

3.1 open_socket_connect (Operator)

open_socket_connect — 打开一个套接字并将其连接到一个接受套接字。

open_socket_connect( : : HostName, Port, GenParamName, GenParamValue : Socket)
//参数
HostName (input_control)      //要连接的计算机的主机名
	Default value: 'localhost'
Port (input_control)         //Port number.
	Suggested values: 3000, 4570
	Typical range of values: 1024 ≤ Port ≤ 65535
	Minimum increment: 1
	Recommended increment: 1
GenParamName (input_control)  //可以为套接字调整的通用参数的名称
	Default value: []
	List of values: 'protocol', 'timeout'
GenParamValue (input_control)  //可以为套接字调整的通用参数的值
	Default value: []
	Suggested values: 0, 3.0, 'infinite', 'HALCON', 'UDP', 'TCP', 'HALCON4', 
	'UDP4', 'TCP4', 'HALCON6', 'UDP6', 'TCP6'
Socket (output_control)      //Socket number

open_socket_connect 打开一个连接套接字到计算机 HostName 上的接受套接字,它侦听端口 Port。

参数“protocol”可用于指定要使用的协议。默认是没有特定地址族的“HALCON”协议。因此,将根据计算机的网络配置自动使用 IPv4 或 IPv6。要使用特定的地址族,必须在协议名称后附加“4”或“6”(分别用于 IPv4 或 IPv6)。例如,“HALCON4”表示通过 IPv4 的 HALCON 连接。通用套接字通信的可能值是“UDP”和“TCP”,它们也支持附加的“4”和“6”。或者,主机名的 IPv4(例如“127.0.0.1”)或 IPv6(例如“::1”)地址的使用决定了要使用的地址族。

两个通信伙伴必须使用相同的协议。要使用通用套接字交换数据,请仅使用 send_data 和 receive_data。

通用参数“超时”可用于设置此操作的超时时间。超时以秒为单位或作为字符串 ‘infinite’ 给出。

对于“HALCON”协议,侦听套接字必须早先在另一个 HALCON 进程中使用操作符 open_socket_accept 创建。要建立连接,接受套接字所在的 HALCON 进程必须调用 socket_accept_connect。有关详细示例,请参阅 open_socket_accept。

对于通用套接字,要连接的套接字可以是来自相同协议类型的任何套接字。

3.2 socket_accept_connect (Operator)

socket_accept_connect — 在协议类型为“HALCON”或“TCP”/“TCP4”/“TCP6”的侦听套接字上接受连接请求。

socket_accept_connect( : : AcceptingSocket, Wait : Socket)
//参数
	AcceptingSocket (input_control)     //接受套接字的套接字编号
	//Should the operator wait until a connection request arrives?
	Wait (input_control) 
		Default value: 'auto'
		List of values: 'auto', 'false', 'true'
	Socket (output_control)         //Socket number.

socket_accept_connect 在侦听套接字 AcceptingSocket 上接受传入连接请求,该请求由另一个 HALCON 进程中的 open_socket_connect 或来自外部应用程序生成。必须使用 open_socket_accept 较早地创建侦听套接字。它的超时决定了 socket_accept_connect 调用的超时时间。如果Wait=‘true’,socket_accept_connect 会等待,直到来自另一个 HALCON 进程的连接请求到达。如果 Wait=‘false’,socket_accept_connect 返回错误 FAIL,如果当前没有来自其他 HALCON 进程的连接请求。如果接受套接字的超时时间不等于0,则Wait 的值’auto’ 会自动等待。 socket_accept_connect 的结果是另一个套接字Socket,用于与另一个进程进行双向通信。建立此连接后,可以通过调用适当的发送或接收操作符在两个进程之间交换数据。有关详细示例,请参阅 open_socket_accept。

对于使用通用套接字的数据传输,只有操作符 send_data 和 receive_data 可用。

3.3 send_image (Operator)

send_image — 通过套接字连接发送图像

send_image(Image : : Socket : )
//参数
	Image (input_object)      //Image to be sent.
	Socket (input_control)    //Socket number.

send_image 通过由 Socket 确定的套接字连接发送图像对象。 接收 HALCON 进程必须调用 receive_image 从套接字读取图像。

3.4 receive_image (Operator)

receive_image — 通过套接字连接接收图像

receive_image( : Image : Socket : )
//参数  
	Image (output_object)      //Image (output_object)  
	Socket (input_control)     //Socket (input_control)

receive_image 读取一个图像对象,该对象是由另一个 HALCON 进程使用操作符 send_image 通过 Socket 确定的套接字连接发送的。 如果没有发送图像,HALCON 进程调用 receive_image 会阻塞,直到有足够的数据到达。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值