本文主要是介绍SFP光口通信控制电源,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
千兆光电转换器测试
- 0 首先拿到千兆光电转换器
- 1 UDP设置值
- 1.1 UDP帧格式
- 1.2 UDP data
- 2 接下来计划
首先在这要夸一下国产产品,现在的电子模块,标准电子元器件或者类似交换机、光电转换器这样的,国产真的是感觉不必国外的差,支持国产。
两天时间从淘宝上买下 就到了,非常的快捷。
0 首先拿到千兆光电转换器
产品如下图所示:
- PC与光电转换器 网口连接以及光电转换器与电源光纤连接
经过与客服上的技术支持 咨询,把光纤线连接如下,并ping通。电源的IP地址设置成192.168.0.100,PC上的IP地址设置成192.168.0.2;并成功ping通。
图片如下:
- 指示灯状态说明
其中光电转换器的指示灯状态说明如下:
FX代表光纤连通,而FX右边的代表网口(电口)连通,上面1000代表1000M。
以上说明物理层 以太帧这块基本没问题。
1 UDP设置值
- 修改Demo例程
通过之前的Python代码,把IP地址修改对应。
需要根据技术手册把UDP帧格式搞懂
根据向销售电源设备的技术支持询问,拿到一段Python代码并读懂,然后根据技术手册对UDP帧格式的说明,修改对应参数。
import socket
import struct # -----------------------------------------------------------------------------
# Parameters:
# -----------------------------------------------------------------------------
# IP地址应该要对应修改一下,变量声明HOST_IP = '192.168.0.2'
HOST_PORT = 28685 #端口自定义 DEST_IP = '192.168.0.100'#DEVICE_IP = '192.168.0.10'
#DEVICE_IP = '255.255.255.255'
DEVICE_PORT = 30721 #标准设备端口号
#RESP_TIMEOUT = 0.4# 是不是构建UDP格式
FAST_PROTOCOL_ID = 0x7631
COMMAND = 0xFFDD # 这值设置的是不是有问题
NONCE = 0x111122223333AAAAFAST_ADDR = 0xFFFF # 地址值
SET_POINT = 6.0 #分别是MSB值 和LSB值 DUMMY_ADDR = 0xAACB
DUMMY_SET_POINT = -4012300012348754.123456789BROADCAST = True# -----------------------------------------------------------------------------
# Costants:
#data = b'\x43\x41\x45\x4E\x65\x6C\x73' #CAENels
#data = b'\x12\x34'
# Packet Header:# 把上面的帧打包成帧 对应UDP格式来进行打包
data = struct.pack('>H', FAST_PROTOCOL_ID) # Bin endian - unsigned short (16 bits - 2 bytes)
data += struct.pack('>H', COMMAND) # Bin endian - unsigned short (16 bits - 2 bytes)
data += struct.pack('>Q', NONCE) # Bin endian - unsigned long long (64 bits - 8 bytes)
# Packet data:
data += struct.pack('>Hf', DUMMY_ADDR, DUMMY_SET_POINT) # 6 bytes
data += struct.pack('>Hf', FAST_ADDR, SET_POINT) # Bin endian - unsigned short + float (2 bytes + 4 bytes)
data += struct.pack('>Hf', DUMMY_ADDR, DUMMY_SET_POINT) # 6 bytes
data += struct.pack('>Hf', DUMMY_ADDR, DUMMY_SET_POINT) # 6 bytes
data += struct.pack('>Hf', DUMMY_ADDR, DUMMY_SET_POINT) # 6 bytes
data += struct.pack('>Hf', FAST_ADDR, SET_POINT) # Bin endian - unsigned short + float (2 bytes + 4 bytes)
data += struct.pack('>Hf', DUMMY_ADDR, DUMMY_SET_POINT) # 6 bytes# Broadcast socket configuration:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.settimeout(1.0)
s.bind((HOST_IP, HOST_PORT))s_recv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s_recv.settimeout(1.0)
s_recv.bind(('', DEVICE_PORT))# Send:
if (BROADCAST):s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, 1) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) s.sendto(data, ('<broadcast>', DEVICE_PORT))
else:s.sendto(data, (DEST_IP, DEVICE_PORT))m = s_recv.recv(1024)
print("Recv:", m)# Close connections:
s.close()
s_recv.close()
1.1 UDP帧格式
UDP帧格式由:UDP header + UDP data 组成。
1.UDP header
UDP 头由 4 个字段组成,每个字段为 16 位。
UDP header = source port + destination port + length +checksum.
1.2 UDP data
The device Fast Address (ID) : 可以设置也可以读取
值是:65535 十六进制是:0XFFFF。
通过光纤可以进行设置数值,如下所示:
尝到成功的感觉了,有点兴奋,兴奋,兴奋。先兴奋半小时,接下来就是对变量和对数值的意义 进行搞清楚。现在是站在别人的肩膀上来实现成功了一下。
2 接下来计划
接下来自己尝试能不能FPGA尝试复现一下Python代码,用Verilog来重写描述一下。
方案:1. 首先是尽可能找到已有现成的FPGA实现Demo,阅读并加以理解。
2. 是看一下论文或者文章,了解一下这大致是个什么过程和实现原理
3. 修改测试一下,还是使用FPGA的网口连接电源。
这篇关于SFP光口通信控制电源的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!