IEC104通信协议分析

缩写:APDU长度 APDU:应用规约数据单元 APCI:应用规约控制信息 ASDU:应用服务数据单元 TYP:类型标识 VSQ:可变结构限定词

COT:传送原因 ADR:ASDU公共地址 IOA: (Information Object Address) 指的是信息对象地址,是用于唯一标识一个数据对象的地址,用于指定一个信息对象(遥信、遥测、遥控等)的地址。

IEC协议的帧格式有三种:I帧、U帧、S帧

I帧:传输应用数据,捎带确认对方的发送

S帧:无应用数据传输,用于传输对站端的确认的报文。 长度:6字节

U帧:用于传输控制命令的报文 长度:6字节

U帧有6种报文:

68 04 07 00 00 00 启动命令
68 04 0B 00 00 00 确认命令

68 04 13 00 00 00 停止命令
68 04 23 00 00 00 停止确认

68 04 43 00 00 00 测试命令

68 04 83 00 00 00 测试确认

S帧有6字节:68 04 01 00 xx xx 前4个字节固定 控制域的第一个 8 位位组的第 1 比特为 1,第 2 比特 为 0 定义了 S 格式

image-20231024093155684

I帧:

I帧中的控制域1与控制域2为发送序号,控制域3与控制域4为接收序号

遥信遥控遥测遥调的起始地址

类别 97版 02版
YX 1H------400H 1H------4000H
YC 701H------900H 4001H------5000H
YK b01H-------b80H 6001H-------6100H
设点 B81H------c00H 6201H------6400H
YM c01H------c80H 6401H------6600H

类型标识

  • 1:单点信息

  • 2:带短时标的单点信息

  • 3:双点信息

  • 4:带短时标的双点信息

  • 5:步长位置信息

  • 6:带短时标的步长位置信息

  • 7:32比特串

  • 8:带短时标的32比特串

  • 9:测量值,归一化值

  • 10:带短时标的测量值,归一化值

  • 11:测量值,标度化值

  • 12:带短时标的测量值,标度化值

  • 13:测量值,短浮点数

  • 14:带短时标的测量值,短浮点数

  • 15:累计值

  • 16:带短时标的累计值

  • 17:带时标的保护设备事件

  • 18:带时标的继电保护装置成组启动事件

  • 19:带时标的继电保护装置成组输出电路信息

# IEC104 Protocol of IEC104 and IEC101 ## by chendajie 2014-2015 ## 电网IEC104/IEC101通信协议 ============================== 隔离协议内容与平台或者硬件相关性,已经在stm32平台和linux平台移植测试通过,可轻松移植到其他平台。 ============================================================================ 队列实现的隔离,目前实现简单的先入先出队列,可根据需求用其他队列算法替换。 移植调用实现: 1.在不同平台下,实现_iec10x结构体的函数指针(利用函数指针实现的接口)。 2.调用RegisterIEC10XMoudle,注册实现的_iec10x接口。 3.创建线程一调用Iex104_Receive管理收包解析。 4.创建线程二调用Iec10x_Scheduled实现出队调度。 5.创建线程三实现状态机Iec104_StateMachine,实现协议状态管理,协议包组包入队。 代码内容 IEC0x目录 iec101.c iec101协议包内容 iec104.c iec104协议包内容 iec10x.c 队列初始化,入队出对实现,队列优先级等相关实现,队列调度实现 PRIO_QUEUE_Iec10x.c 队列具体算法实现 test目录 linux上简单测试代码,仅供参考,作者具体协议应用在stm32上,利用状态机控制数据包入队与出队调度 重要函数: Iec10x_Scheduled:出队调度 IEC10X_Enqueue:入队函数 IEC10X_Dequeue:出队函数 IEC10X_FindQHead:查找最高优先级数据包 IEC10X_XXX:前缀为IEC10X_的函数为各个协议包的组包函数 Iec104_StateMachine: 104协议状态机 Iex104_Receive:收包解析 RegisterIEC10XMoudle:协议模块注册,初始化 重要结构体: 用函数指针实现的移植接口,根据不同平台与硬件特性,选择性实现以下接口 typedef struct _iec10x { char * name; int (* Init)(void); void (* Delay_ms)(uint16_t); void (* CloseLink)(void); void *(* Malloc)(uint8_t NumByte); void (* Free)(void *buffer); uint8_t (* enqueue)(Iec10x_PrioQueue_T *QueueHdr, Iec10x_PrioNode_T *NewNode); Iec10x_PrioNode_T *(* dequeue)(Iec10x_PrioQueue_T * QueueHdr); Iec10x_PrioNode_T *(* FindQHead)(Iec10x_PrioQueue_T * QueueHdr); char (* GetPrio)(void); void (* InitQueue)(Iec10x_PrioQueue_T *PrioQueue); void (* ClearQueue)(Iec10x_PrioQueue_T * QueueHdr); uint8_t (* Send)(int socketfd,char *data,int len); uint32_t (* SetTime)(PCP56Time2a_T time); uint32_t (* GetTime)(PCP56Time2a_T time); int8_t (* GetStationState)(uint16_t Addr, uint8_t DevType); float (* GetStaValue)(uint16_t Addr, uint8_t DevType); uint16_t (* GetLinkAddr)(void); int8_t (* GetInfoNum)(uint8_t *InfoNum, uint8_t DevType); int8_t (* SetConfig)(long Value, uint32_t addr); int8_t (* SaveFirmware)(uint8_t FirmLen, uint8_t *buf,uint32_t FirmwareType, uint32_t Iec10x_Update_SeekAddr); int8_t (* CheckFirmware)(uint32_t FirmwareType, uint32_t TotalLen); int8_t (* UpdateFirmware)(uint32_t FirmwareType); int8_t (* BackoffFirmware)(uint32_t FirmwareType); #ifdef IEC10XLOCK void (* LOCK)(void); void (* UNLOCK)(void); #endif } *PIEC10X_T, IEC10X_T;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值