if (portSERIAL_ID == 2) { gRunPara.Net_iec101Para[portSERIAL_ID].modeSECRET = 1; } llParameters->modeOfSecret = gRunPara.Net_iec101Para[portSERIAL_ID].modeSECRET; 和llParameters->modeOfSecret = gRunPara.Net_iec101Para[portSERIAL_ID].modeSECRET;//2; if (portSERIAL_ID == 2) llParameters->modeOfSecret = 1; 这两种写法是不是都可以

时间: 2024-03-29 15:42:06 浏览: 6
这两种写法的实现效果并不相同。 第一种写法是先判断`portSERIAL_ID`是否等于2,如果是,则直接修改`gRunPara.Net_iec101Para[portSERIAL_ID].modeSECRET`的值为1,然后再将`llParameters->modeOfSecret`的值设置为`gRunPara.Net_iec101Para[portSERIAL_ID].modeSECRET`的值。 第二种写法是先将`llParameters->modeOfSecret`的值设置为`gRunPara.Net_iec101Para[portSERIAL_ID].modeSECRET`的值,然后再判断`portSERIAL_ID`是否等于2,如果是,则将`llParameters->modeOfSecret`的值覆盖为1。 因此,这两种写法的实现逻辑并不相同。如果需要修改`gRunPara.Net_iec101Para[portSERIAL_ID].modeSECRET`的值,那么应该使用第一种写法;如果只需要根据`portSERIAL_ID`的值来判断和修改`llParameters->modeOfSecret`的值,那么可以使用第二种写法。
相关问题

if (portSERIAL_ID == 2) { llParameters->modeOfSecret = 1; } else { llParameters->modeOfSecret = gRunPara.Net_iec101Para[portSERIAL_ID].modeSECRET;//2; } 和 llParameters->modeOfSecret = gRunPara.Net_iec101Para[portSERIAL_ID].modeSECRET;//2; if (portSERIAL_ID == 2) llParameters->modeOfSecret = 1; 这两种写法一样吗

这两种写法并不完全一样。 第一种写法是通过判断`portSERIAL_ID`的值来给`llParameters->modeOfSecret`赋值,当`portSERIAL_ID`的值为2时,赋值为1,否则赋值为`gRunPara.Net_iec101Para[portSERIAL_ID].modeSECRET`。 第二种写法是先给`llParameters->modeOfSecret`赋值为`gRunPara.Net_iec101Para[portSERIAL_ID].modeSECRET`,然后再判断`portSERIAL_ID`的值是否为2,如果是2,则把之前的赋值覆盖为1。 所以,两种写法的结果可能是一样的,但是逻辑上还是有一些差别的。在实际应用中,根据具体情况选择哪种写法更加合适。

逐行解释 if ( m_env->m_ClearSendQueFlag ) //默认0:不清空发送队列 { m_asduSendQue.ClearAllDataBuff(); } memset(m_sendBuf,0,MaxLen_Buf); this->m_env->m_TxBuf.ResetBuf(); m_Flag |= IEC104_FLAG_STARTDT; //设置STARDT标识 OutputLogMsgToLogFile("var/log/s104.log",320000,"%s:%d INFO! STARTDT! 104startdtresrt=%d ClearSendQueFlag=%d RtuNo=%d\n", __FILE__,__LINE__,m_env->m_104startdtresrt,m_env->m_ClearSendQueFlag,m_env->m_sRtuNo); //GetUpTime( &m_TimeOnStartDT ); //SysSleepMs(2,0); this->m_dataTransflag = 0x01; this->m_env->m_appLayer->StartDTProcess(); //ztn 20170719 add }

这是一段 C++ 代码,其中包含了一些条件语句和函数调用。逐行解释如下: ```if ( m_env->m_ClearSendQueFlag )``` 如果 `m_env->m_ClearSendQueFlag` 变量为真(非零),则执行下面的代码块。 ```m_asduSendQue.ClearAllDataBuff();``` 调用 `m_asduSendQue` 对象的 `ClearAllDataBuff()` 函数,清空发送队列的所有数据缓冲区。 ```memset(m_sendBuf,0,MaxLen_Buf);``` 使用 `memset()` 函数将 `m_sendBuf` 数组的所有元素都设置为 0,该数组的长度为 `MaxLen_Buf`。 ```this->m_env->m_TxBuf.ResetBuf();``` 调用 `m_env` 对象的 `m_TxBuf` 成员的 `ResetBuf()` 函数,重置该成员对象的缓冲区。 ```m_Flag |= IEC104_FLAG_STARTDT;``` 将 `m_Flag` 变量的二进制表示中的第 0 位(从右往左数)设置为 1,表示启动传输(STARTDT)。 ```OutputLogMsgToLogFile("var/log/s104.log",320000,"%s:%d INFO! STARTDT! 104startdtresrt=%d ClearSendQueFlag=%d RtuNo=%d\n",__FILE__,__LINE__,m_env->m_104startdtresrt,m_env->m_ClearSendQueFlag,m_env->m_sRtuNo);``` 调用 `OutputLogMsgToLogFile()` 函数,将日志信息记录到文件中。该函数的第一个参数是文件名,第二个参数是日志文件的最大大小,第三个参数是日志信息的格式化字符串,后面的参数是对应的参数值。 ```this->m_dataTransflag = 0x01;``` 将 `m_dataTransflag` 变量的值设置为 1,表示数据传输。 ```this->m_env->m_appLayer->StartDTProcess();``` 调用 `m_env` 对象的 `m_appLayer` 成员的 `StartDTProcess()` 函数,启动应用层的 STARTDT 过程。

相关推荐

void CIEC104SubLinkLayer::run_rx( PROTO_PARA_RX* rx ) { // 取数据到本地缓冲区 int iTmp; iTmp = this->m_env->m_RxBuf.GetReadableLen(); if( iTmp>0 ) { // 查找报文头 uint8 buf[MaxLen_Buf]; int len = MaxLen_Buf>iTmp?iTmp:MaxLen_Buf; int move; this->m_env->m_RxBuf.Read( buf,len, DONT_MOVEFWD ); for( move=0;move<len;move++ ) if( buf[move] == 0x68 ) break; if( move>=len ) // 没有找到报文头 { this->m_env->m_RxBuf.MoveReadP(move); return; } // 解析数据 CFrameLink frame; uint8 flag; if ((m_Flag & IEC104_FLAG_STARTDT) || m_dataTransflag) { flag = 1; } else flag = 0; KFprintf("%s-%d flag=%d\n",__FILE__,__LINE__,flag); frame.setstartDTFlag(flag); iTmp = frame.decode( buf+move,len-move ); m_StoppedRecIflagLink = frame.getStoppedRecIflag(); ////2018.5.28 zbc 开普测试 stopped状态下收到I帧要断连接 if(m_StoppedRecIflagLink != 0) if( iTmp < 0 )//错误 { // 检测是否无效帧 //if( this->m_env->m_RxBuf.GetReadableLen()>=MaxLen_Buf ) this->m_env->m_RxBuf.MoveReadP(move + ABS(iTmp)); //移动MOVE + ABS(iTmp) return; } else if( iTmp == 0 )//没有收够一个帧,不移动指针 { return; } m_env->AddRxFrames( 1,iTmp ); m_env->m_iRxRetFlag = 1; protocolCall.PutProtocolRxGram( rx->channo,buf+move,iTmp ); // 移动读指针 move +=iTmp; this->m_env->m_RxBuf.MoveReadP(move); GetUpTime(&m_lastRecvDataTime); //m_ifTestingLink = false; static int32 scount =0; // 处理.根据帧类型处理 uint8 frameType = frame.getFrameType(); if( frameType==FrameLink_Type_U ) { //通道测试确认帧 if( frame.getTestFrConf()==1 ) { m_Flag &= ~IEC104_FLAG_UT1; GetUpTime( &m_TimeOut_NoGram ); return; } //通道测试帧 if( frame.getTestFrAvai()!=0 ) { frame.setTestFrAvai( 0x00 ); frame.setTestFrConf( 0x01 ); KFprintf("%s:%d 104 m_iDataMgrNo=%d\n",__FILE__,__LINE__,m_env->m_iDataMgrNo); }

uint8 frameType = frame.getFrameType(); if( frameType==FrameLink_Type_U ) { //通道测试确认帧 if( frame.getTestFrConf()==1 ) { m_Flag &= ~IEC104_FLAG_UT1; GetUpTime( &m_TimeOut_NoGram ); return; } //通道测试帧 if( frame.getTestFrAvai()!=0 ) { frame.setTestFrAvai( 0x00 ); frame.setTestFrConf( 0x01 ); KFprintf("%s:%d 104 m_iDataMgrNo=%d\n",__FILE__,__LINE__,m_env->m_iDataMgrNo); } //启动数据传输 if( frame.getStartDtAvai()!=0 ) { frame.setStartDtAvai( 0x00 ); frame.setStartDtConf( 0x01 ); KFprintf(KFPRINTF_LEVEL_IMPORTANT,"StartDt--- 开启应用数据传输 ---\n"); if (!m_env->m_104startdtresrt)//默认0 复位 { this->resetAnyway(); } if ( m_env->m_ClearSendQueFlag ) //默认0:不清空发送队列 { m_asduSendQue.ClearAllDataBuff(); } memset(m_sendBuf,0,MaxLen_Buf); this->m_env->m_TxBuf.ResetBuf(); m_Flag |= IEC104_FLAG_STARTDT; //设置STARDT标识 OutputLogMsgToLogFile("var/log/s104.log",320000,"%s:%d INFO! STARTDT! 104startdtresrt=%d ClearSendQueFlag=%d RtuNo=%d\n", __FILE__,__LINE__,m_env->m_104startdtresrt,m_env->m_ClearSendQueFlag,m_env->m_sRtuNo); //GetUpTime( &m_TimeOnStartDT ); //SysSleepMs(2,0); this->m_dataTransflag = 0x01; this->m_env->m_appLayer->StartDTProcess(); //ztn 20170719 add } //停止数据传输 if( frame.getStopDtAvai()!=0 ) { frame.setStopDtAvai( 0x00 ); frame.setStopDtConf( 0x01 ); memset(m_sendBuf,0,MaxLen_Buf); this->m_env->m_TxBuf.ResetBuf(); m_Flag &= ~IEC104_FLAG_STARTDT; //清除STARDT标识 this->m_dataTransflag = 0x00; this->m_env->m_appLayer->Ini

最新推荐

recommend-type

C Standard C89 C90-ISO_IEC-9899-1990-含书签.pdf

ISO/IEC 9899:1990 (C90) 官方英文完整版,含完整书签。 其他C标准官方 PDF 下载链接见: https://blog.csdn.net/jhsword/article/details/107932992 包含: C90英文版、C90中文版、C99英文版、C11英文版、C17英文...
recommend-type

C Standard C11-ISO_IEC-9899-2011-含书签.pdf

ISO/IEC 9899:2011 (C11) 官方英文完整版,含完整书签。 其他C标准官方 PDF 下载链接见: https://blog.csdn.net/jhsword/article/details/107932992 包含:C90英文版、C90中文版、C99英文版、C11英文版、C17英文...
recommend-type

IEC-61851-1-2017中文版

IEC 61851-1-2017 Electric vehicle conductive charging system Part 1: General requirements 电动汽车传导充电系统 第 1 部分:一般要求
recommend-type

c069981_ISO_IEC_8825-7_2015.pdf

ASN.1 OER编码,英文版 Information technology — ASN.1 encoding rules: Specification of Octet Encoding Rules (OER)
recommend-type

ISOIEC_10918-1_ITU-T.81

本文为JPEG编解码设计标准文档,英文原版。 jpeg一般指JPEG格式。JPEG(Joint Photographic Experts Group)是JPEG标准的产物,该标准由国际标准化组织(ISO)制订,是面向连续色调静止图像的一种压缩标准。...
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章

![:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章](https://img-blog.csdnimg.cn/img_convert/69b98e1a619b1bb3c59cf98f4e397cd2.png) # 1. 目标检测算法概述 目标检测算法是一种计算机视觉技术,用于识别和定位图像或视频中的对象。它在各种应用中至关重要,例如自动驾驶、视频监控和医疗诊断。 目标检测算法通常分为两类:两阶段算法和单阶段算法。两阶段算法,如 R-CNN 和 Fast R-CNN,首先生成候选区域,然后对每个区域进行分类和边界框回归。单阶段算法,如 YOLO 和 SSD,一次性执行检
recommend-type

设计算法实现将单链表中数据逆置后输出。用C语言代码

如下所示: ```c #include <stdio.h> #include <stdlib.h> // 定义单链表节点结构体 struct node { int data; struct node *next; }; // 定义单链表逆置函数 struct node* reverse(struct node *head) { struct node *prev = NULL; struct node *curr = head; struct node *next; while (curr != NULL) { next
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。