Ortec974A EPICS IOC程序
Ortec974A设备介绍,请见Ortec -- 974A 四通道100-MHz计时器/计数器_ortec974a_EPICS Technical的博客-CSDN博客
1) 创建一个用户存放这个IOC程序结构的目录:
root@orangepi4-lts:/usr/local/EPICS/program# mkdir ortec974A
root@orangepi4-lts:/usr/local/EPICS/program# cd ortec974A/
root@orangepi4-lts:/usr/local/EPICS/program/ortec974A# ls
2)使用makeBaseApp.pl构建这个IOC程序架构:
root@orangepi4-lts:/usr/local/EPICS/program/ortec974A# makeBaseApp.pl -t ioc ortec974A
root@orangepi4-lts:/usr/local/EPICS/program/ortec974A# makeBaseApp.pl -i -t ioc ortec974A
Using target architecture linux-aarch64 (only one available)
The following applications are available:ortec974A
What application should the IOC(s) boot?
The default uses the IOC's name, even if not listed above.
Application name?
root@orangepi4-lts:/usr/local/EPICS/program/ortec974A# ls
configure  iocBoot  Makefile  ortec974AApp3)编辑configure/RELEASE文件,添加这个IOC程序所需要的其它依赖模块:
...
SUPPORT=/usr/local/EPICS/synApps/support
ASYN=$(SUPPORT)/asyn
AUTOSAVE=$(SUPPORT)/autosave
CALC=$(SUPPORT)/calc
SCALER=$(SUPPORT)/scaler
...
4) 进入源文件目录ortec974AApp/src目录下:
a) 编写974A驱动程序源文件:
// drvOrtec974A.cpp
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <stdio.h>
#include <math.h>#include <asynPortDriver.h>
#include <asynOctetSyncIO.h>
#include <epicsEvent.h>
#include <epicsThread.h>
#include <epicsTime.h>
#include <errlog.h>
#include <iocsh.h>
#include <epicsExport.h> /* Defines epicsExportSharedSymbols */#include "devScalerAsyn.h"#define MAX_CHANNELS 4#define timeOut 0.1
static const char *driverName= "Scaler974A";class Scaler974A:public asynPortDriver
{
public:Scaler974A(const char *portName, const char *serialPort, int serialAddr, int poll);virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value);virtual asynStatus readInt32Array(asynUser *pasynUser,epicsInt32 *value, size_t nElements, size_t *nIn);virtual void report(FILE *fp, int details);void eventThread();private:int scalerReset;int scalerChannels;int scalerRead;int scalerReadSingle;int scalerPreset;int scalerArm;int scalerDone;double polltime;epicsEventId eventId;asynUser *pasynUserScaler;asynStatus sendCommand(const char *command, char *statusString, size_t maxStatusLen, size_t *statusLen);
};static void eventThreadC(void *pPvt)
{Scaler974A *pScaler974A = (Scaler974A *)pPvt;pScaler974A->eventThread();
}Scaler974A::Scaler974A(const char *portName, const char *serialPort, int serialAddr, int poll):asynPortDriver(portName, MAX_CHANNELS,asynInt32Mask | asynInt32ArrayMask | asynDrvUserMask,asynInt32Mask,/* Should also be ASYN_CANBLOCK, but device support does not work with asynchronous devices */ASYN_MULTIDEVICE,1,0,0)
{int i;asynStatus status;static const char *functionName="Scaler974A";if (poll==0) poll=100;this->polltime=poll / 1000.;this->eventId = epicsEventCreate(epicsEventEmpty);status = pasynOctetSyncIO->connect(serialPort, serialAddr, &this->pasynUserScaler, NULL);if (status != asynSuccess) {asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR,"%s:%s: error connecting to port %s address %d\n",driverName, functionName, serialPort, serialAddr);return;}createParam(SCALER_RESET_COMMAND_STRING,        asynParamInt32,     &this->scalerReset);createParam(SCALER_CHANNELS_COMMAND_STRING,     asynParamInt32,     &this->scalerChannels);createParam(SCALER_READ_COMMAND_STRING,         asynParamInt32Array,&this->scalerRead);createParam(SCALER_READ_SINGLE_COMMAND_STRING,  asynParamInt32,     &this->scalerReadSingle);createParam(SCALER_PRESET_COMMAND_STRING,       asynParamInt32,     &this->scalerPreset);createParam(SCALER_ARM_COMMAND_STRING,          asynParamInt32,     &this->scalerArm);createParam(SCALER_DONE_COMMAND_STRING,         asynParamInt32,     &this->scalerDone);setIntegerParam(scalerChannels, MAX_CHANNELS);setIntegerParam(scalerDone, 1);for (i=0; i<MAX_CHANNELS; i++) setIntegerParam(i, scalerReadSingle, 0);epicsThreadCreate("Scaler974A",epicsThreadPriorityMedium,epicsThreadGetStackSize(epicsThreadStackMedium),(EPICSTHREADFUNC)eventThreadC,this);
}asynStatus Scaler974A::sendCommand(const char *command, char *statusString, size_t maxStatusLen, size_t *statusLen)
{size_t nWrite;asynStatus status;double timeout = 1.0;int eomReason;static const char *functionName = "sendCommand";/** asynStatus (*writeRead)(asynUser *pasynUser,const char *write_buffer, size_t write_buffer_len,char *read_buffer, size_t read_buffer_len,double timeout,size_t *nbytesOut, size_t *nbytesIn, int *eomReason);要写的字符串,要写的字符串长度,读出缓存,要读的字节数目,超时时间,实际写出的字节数,实际读入的字符数,结束原因asynStatus (*write)(asynUser *pasynUser,  char const *buffer, size_t buffer_len,double timeout,size_t *nbytesTransfered);asynStatus (*read)(asynUser *pasynUser, char *buffer, size_t buffer_len,double timeout, size_t *nbytesTransfered,int *eomReason);** */status = pasynOctetSyncIO->write(this->pasynUserScaler, command, strlen(command),  timeout, &nWrite);
//      printf("In sendCommand write status: %d,write content:%s,write length:%d\n", status, command, nWrite);if (status != asynSuccess) goto done;epicsThreadSleep(.1);status = pasynOctetSyncIO->read(this->pasynUserScaler,statusString, maxStatusLen, timeout, statusLen, &eomReason);
//      printf("In sendCommand read status: %d, statusString:%s\n", status, statusString);done:if (status != asynSuccess) {asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR,"%s:%s: writing command %s, error=%s\n",driverName, functionName, command, this->pasynUserScaler->errorMessage);}return(status);
}asynStatus Scaler974A::writeInt32(asynUser *pasynUser, epicsInt32 value)
{int function = pasynUser->reason;char response[256];size_t responseLen;asynStatus status = asynSuccess;static const char *functionName="writeInt32";setIntegerParam(function, value);if(function==this->scalerReset){this->sendCommand("STOP\r", response, sizeof(response), &responseLen);//printf("STOP:%s\n", response);this->sendCommand("CLEAR_ALL\r", response, sizeof(response), &responseLen);//printf("CLEAR_ALL:%s\n", response);asynPrint(pasynUser, ASYN_TRACE_FLOW, "%s:%s scalerReset\n",driverName, functionName);}else if(function==this->scalerArm){if(value !=0){/* Start counting */this->sendCommand("START\r", response, sizeof(response), &responseLen);
//          printf("START:%s\n", response);setIntegerParam(scalerDone, 0);epicsEventSignal(this->eventId);}else{/* Stop counting */status = this->sendCommand("STOP\r", response, sizeof(response), &responseLen);
//          printf("STOP:%s\n", response);setIntegerParam(scalerDone, 1);}asynPrint(pasynUser, ASYN_TRACE_FLOW, "%s:%s scalerArm=%d\n", driverName, functionName,value);}else if(function==this->scalerPreset){int m,n;char newstr[25];n=(int)log10(double(value));m=(int)(value/pow(10.0,n));sprintf(newstr, "SET_COUNT_PRESET %d,%d\r", m, n);this->sendCommand(newstr, response, sizeof(response), &responseLen);
//      printf("SET_COUNT_PRESET:%s\n", response);asynPrint(pasynUser, ASYN_TRACE_FLOW, "%s;%s scalerPreset channel", driverName, functionName);}else{asynPrint(pasynUser,ASYN_TRACE_ERROR,"%s:%s got illegal function %d\n", driverName, functionName, function);}callParamCallbacks();return(status);
}asynStatus Scaler974A::readInt32Array(asynUser *pasynUser, epicsInt32 *value, size_t maxChannel, size_t *nIn)
{static const char *functionName="readInt32Array";int function = pasynUser->reason;int temp;int i;if (maxChannel > MAX_CHANNELS) maxChannel = MAX_CHANNELS;*nIn = maxChannel;if (function==scalerRead){for (i=0; i<(int)maxChannel; i++){getIntegerParam(i, scalerReadSingle, &temp);value[i] = temp;}asynPrint(pasynUser, ASYN_TRACEIO_DRIVER,"%s:%s: value=%d %d %d %d\n",driverName, functionName, value[0], value[1], value[2], value[3]);} else {asynPrint(pasynUser,ASYN_TRACE_ERROR,"%s:%s got illegal function %d\n", driverName, functionName,  function);return(asynError);}return(asynSuccess);
}void Scaler974A::report(FILE *fp, int details)
{asynPortDriver::report(fp, details);
}void Scaler974A::eventThread()
{int done, presetCount;char response[100], statusString[256];size_t responseLen, statusLen;int counts[MAX_CHANNELS];int i;asynStatus status;static const char *functionName="eventThread";while(1){epicsEventMustWait(this->eventId);while(1){status = this->sendCommand("SHOW_COUNTS\r", statusString, sizeof(statusString), &statusLen);sscanf(statusString, "%d;%d;%d;%d;",&counts[0], &counts[1], &counts[2], &counts[3]);
//          printf("%d;%d;%d;%d\n", counts[0],counts[1],counts[2],counts[3]);asynPrint(this->pasynUserSelf, ASYN_TRACEIO_DRIVER,"%s:%s status=%d, counts=%d %d %d %d\n",driverName, functionName, status, counts[0], counts[1], counts[2], counts[3]);this->lock();/* Get value of done in case scaler was stopped by scalerArm(0) */getIntegerParam(scalerDone, &done);getIntegerParam(scalerPreset, &presetCount);if (!done && (counts[0] >= presetCount)) done = 1;setIntegerParam(scalerDone, done);for (i=0; i<MAX_CHANNELS; i++) {setIntegerParam(i, scalerReadSingle, counts[i]);callParamCallbacks(i, i);}this->unlock();if (done) break;epicsThreadSleep(this->polltime/1000.0);}}
}extern "C" int initScaler974A(const char *portName, const char *serialPort, int serialAddr, int poll)
{new Scaler974A(portName, serialPort, serialAddr, poll);return(asynSuccess);
}/* iocsh function */
static const iocshArg initArg0 = {"Port Name", iocshArgString};
static const iocshArg initArg1 = {"IPPort", iocshArgString};
static const iocshArg initArg2 = {"Addr", iocshArgString};
static const iocshArg initArg3 = {"Poll", iocshArgInt};
static const iocshArg *const initArgs[] = {&initArg0,&initArg1,&initArg2,&initArg3};
static const iocshFuncDef initFuncDef = {"initScaler974A",4, initArgs};
static void initCallFunc(const iocshArgBuf *args)
{initScaler974A(args[0].sval, args[1].sval, args[2].ival, args[3].ival);
}void Scaler974ARegister(void)
{iocshRegister(&initFuncDef,initCallFunc);
}extern "C" {
epicsExportRegistrar(Scaler974ARegister);
}b) 添加一个dbd文件ortec974ASupport.dbd:
registrar(Scaler974ARegister)c) 修改同一目录下Makefile文件,指定编译中需要包含的库文件和源文件:
TOP=../..include $(TOP)/configure/CONFIG
#----------------------------------------
#  ADD MACRO DEFINITIONS AFTER THIS LINE
#=============================#=============================
# Build the IOC applicationPROD_IOC = ortec974A
# ortec974A.dbd will be created and installed
DBD += ortec974A.dbd# ortec974A.dbd will be made up from these files:
ortec974A_DBD += base.dbd
ortec974A_DBD += ortec974ASupport.dbd# Include dbd files from all support applications:
#ortec974A_DBD += xxx.dbdortec974A_DBD += drvAsynIPPort.dbd
ortec974A_DBD += asyn.dbd
ortec974A_DBD += scalerSupport.dbd
ortec974A_DBD += calcSupport.dbd
ortec974A_DBD += asSupport.dbd# Include dbd files from all support applications:
#ortec974A_DBD += xxx.dbd# Add all the support libraries needed by this IOC
ortec974A_LIBS += asyn
ortec974A_LIBS += scaler
ortec974A_LIBS += calc
ortec974A_LIBS += autosave# Add all the support libraries needed by this IOC
#ortec974A_LIBS += xxxortec974A_SRCS += drvOrtec974A.cpp
# ortec974A_registerRecordDeviceDriver.cpp derives from ortec974A.dbd
ortec974A_SRCS += ortec974A_registerRecordDeviceDriver.cpp# Build the main IOC entry point on workstation OSs.
ortec974A_SRCS_DEFAULT += ortec974AMain.cpp
ortec974A_SRCS_vxWorks += -nil-# Add support from base/src/vxWorks if needed
#ortec974A_OBJS_vxWorks += $(EPICS_BASE_BIN)/vxComLibrary# Finally link to the EPICS Base libraries
ortec974A_LIBS += $(EPICS_BASE_IOC_LIBS)#===========================include $(TOP)/configure/RULES
#----------------------------------------
#  ADD RULES AFTER THIS LINE5) 进入ortec974AApp/Db目录,编写一个用于自动保存的文件scaler4_settings.req:
$(P)$(S).TP
$(P)$(S).TP1
$(P)$(S).CONT
$(P)$(S).DLY1
$(P)$(S).RAT1
$(P)$(S).PREC
$(P)$(S).FREQ
$(P)$(S).RATE
$(P)$(S).DLY
$(P)$(S).COUT
file "scaler_channelN_settings.req", P=$(P), S=$(S), Ch=1
file "scaler_channelN_settings.req", P=$(P), S=$(S), Ch=2
file "scaler_channelN_settings.req", P=$(P), S=$(S), Ch=3
file "scaler_channelN_settings.req", P=$(P), S=$(S), Ch=4在同一目录下的Makefile中添加一行:DB += scaler4_settings.req
6) 退出到这个IOC的顶层目录,执行make进行程序编译。
7)进入到启动目录iocBoot/iocortec974A,创建两个目录:
root@orangepi4-lts:/usr/local/EPICS/program/ortec974A/iocBoot/iocortec974A# mkdir -p req/ortec974A
root@orangepi4-lts:/usr/local/EPICS/program/ortec974A/iocBoot/iocortec974A# mkdir -p autosave/ortec974A在req/ortec974A下编写一个用于自动保存的文件auto_settings.req,内容如下:
file scaler4_settings.req  P=$(P) S=$(S)编写启动脚本:
#!../../bin/linux-aarch64/ortec974A#- You may have to change ortec974A to something else
#- everywhere it appears in this file< envPathscd "${TOP}"## Register all support components
dbLoadDatabase "dbd/ortec974A.dbd"
ortec974A_registerRecordDeviceDriver pdbbasedrvAsynIPPortConfigure("ortec974A", "192.168.3.30:4001", 0, 0 ,1)initScaler974A("tcportec974A","ortec974A",0,10)
dbLoadRecords("${SCALER}/db/scaler.db", "P=Ortec974A:,S=Scaler1,OUT=@asyn(tcportec974A 0 0),DTYP=Asyn Scaler,FREQ=10,TP=1,TP1=0.5,PR1=1,CONT=1")set_requestfile_path("$(TOP)/db")
set_requestfile_path("$(SCALER)/db")
set_requestfile_path("$(TOP)/iocBoot/$(IOC)/req/ortec974A")# 通过调用set_savefile_path函数指定你想要.sav文件被写到哪个目录中。
set_savefile_path("$(TOP)/iocBoot/$(IOC)/autosave/ortec974A")# 使用set_pass<N>_restoreFile()函数
# 指定哪些save文件要在记录初始化前(pass 0)前被恢复,以及哪些save文件在记录初始化后(pass 1)被恢复
set_pass1_restoreFile("auto_settings.sav")save_restoreSet_numSeqFiles(3)
save_restoreSet_SeqPeriodInSeconds(600)
save_restoreSet_RetrySeconds(60)
save_restoreSet_CAReconnect(1)
save_restoreSet_CallbackTimeout(-1)dbLoadRecords("$(ASYN)/db/asynRecord.db","P=Ortec974A:Scaler1:,R=Asyn,PORT=ortec974A,ADDR=0,IMAX=100,OMAX=100")cd "${TOP}/iocBoot/${IOC}"
iocInitcreate_monitor_set("auto_settings.req",5,"P=Ortec974A:,S=Scaler1")8) 用以上启动脚本启动这个IOC程序:
root@orangepi4-lts:/usr/local/EPICS/program/ortec974A/iocBoot/iocortec974A# ../../bin/linux-aarch64/ortec974A st.cmd9)查看这个IOC加载的记录:
epics> dbl
Ortec974A:Scaler1:Asyn
Ortec974A:Scaler110) 用CSS编写操作客户端:
 11) 在97A的3号输入端口接入一个3MHz的TTL信号,将计数时间设置为1.0秒,点击Count按钮,进行1秒钟计数:
11) 在97A的3号输入端口接入一个3MHz的TTL信号,将计数时间设置为1.0秒,点击Count按钮,进行1秒钟计数:

通道3能够读出计数器的正确计数值。
相关文章:
 
Ortec974A EPICS IOC程序
Ortec974A设备介绍,请见Ortec -- 974A 四通道100-MHz计时器/计数器_ortec974a_EPICS Technical的博客-CSDN博客 1) 创建一个用户存放这个IOC程序结构的目录: rootorangepi4-lts:/usr/local/EPICS/program# mkdir ortec974A rootorangepi4-l…...
JS-文件下载,实现在ios也是下载 而不是预览,
需求 通过A链接的方式,把从后台获取到的文件下载到本地,实现在移动端,PC端都能下载 问题 通过ajax请求后端生成的文件流之后,创建BLOB文件进行下载,在PC端和移动安卓端都可以实现下载到本地和对应的手机,而在IOS端的…...
Leetcode.275 H 指数 II
题目链接 Leetcode.275 H 指数 II mid 题目描述 给你一个整数数组 c i t a t i o n s citations citations ,其中 c i t a t i o n s [ i ] citations[i] citations[i] 表示研究者的第 i i i 篇论文被引用的次数, c i t a t i o n s citations citat…...
代码随想录Day40-单调栈:力扣第496e、503m、42h、84h题
496e. 下一个更大元素 I 题目链接 代码随想录文章讲解链接 方法一:单调栈哈希表 用时:13m52s 思路 维护一个栈底到栈顶是单调递减的栈,从后往前遍历数组nums2,更新栈。nums2当前元素nums2[i]的下一个更大元素就是栈顶元素&am…...
 
Git窗口打开vim后如何退出编辑(IDEA/Goland等编辑器)
最近在学习git高级操作过程中,遇到了一下问题: 我在学习Git合并多个commit为一个的时候,需要输入一个命令 git rebase -i HEAD~2 这说明已经是编辑模式了。当我写好后,我还按照原来在linux上的按下ESC键,但是只是光…...
【CSDN 每日一练 ★★☆】【二叉树/BSF】二叉树的层序遍历
【CSDN 每日一练 ★★☆】【二叉树/BSF】二叉树的层序遍历 二叉树 BSF 题目 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。 示例: 二叉树:[3,9,20,null,nul…...
 
Golang | Zinx学习笔记(一)
参考 http://zinx.me/ https://www.kancloud.cn/aceld/zinx/1960213 https://www.yuque.com/aceld/tsgooa/gx01meg5ow4pftac 说明 zinx是一个基于Golang的轻量级并发服务器框架。 目前zinx已经在很多企业进行开发使用,具体使用领域包括:后端模块的消息中转、长链…...
 
【Java 进阶篇】在Java Web应用中获取ServletContext对象详解
在Java Web应用开发中,ServletContext对象扮演着重要的角色,它允许你在整个Web应用程序中存储和共享数据。ServletContext对象是Servlet容器提供的一种用于管理Web应用程序的全局信息的方式。本文将详细探讨ServletContext对象的概念、用途以及如何在Jav…...
 
负债6W,依靠这个项目副业6个月还清欠款,还多存了10W+
真不敢想象负债6W“走投无路”的我还能通过副业逆天翻盘,6个月还清欠款,还让我多了10W存款,现在小日子也是相当滋润,吃穿不愁,不用过多为生计而奔波操劳。 仅代表个人收益 网盘下载地址:【安卓软件】音魔变…...
 
快速了解ClickHouse!
简介 ClickHouse是一个开源列式数据库管理系统(DBMS),用于在线分析处理(OLAP): 列式存储:与传统的行式数据库不同,ClickHouse以列的形式存储数据,这使得在分析大量数据时…...
 
PythonWEB
文章目录 前端简介1. 什么是网页2. 网页的组成3. 网页的优势4. 前端三剑客5. 编写步骤6. HTTP协议 HTML51. HTML介绍2. 元素3. 使用4. 基本结构解析5. 常用标签文本标签容器标签列表标签表格标签表单标签 对于文件数据的提交需要满足以下两个条件:6. 标签分类 前端简…...
 
【工具问题】IDEA每次关闭的时候都会弹框显示closing project,然后弹框持续很久就像卡住了
idea关闭的时候出现问题 问题展示为什么会出现这种情况怎么解决 问题展示 我idea已经关闭了,但是这个弹框要持续很久才能关闭 为什么会出现这种情况 我的plugins原本是加载不出来的,所以我按照网上说法去做 怎么解决 file->setting,再如图选择…...
 
从瀑布模式到水母模式:ChatGPT如何赋能软件研发全流程
文章目录 前言内容简介作者简介专家推荐读者对象直播预告 前言 计算机技术的发展和互联网的普及,使信息处理和传输变得更加高效,极大地改变了金融、商业、教育、娱乐等领域的运作方式。数据分析、人工智能和云计算等新兴技术,也在不断地影响和…...
 
类变量/方法、main语法、代码块
一.类变量和方法 思维导图概览: 1.1类变量(静态变量) 1.什么叫做类变量/方法? ——给类中的成员属性或成员方法加上static关键字进行修饰,类变量/方法也叫做静态变量/方法,静态变量/方法被类的自身所有对…...
[SHCTF 校外赛道] crypto
终于都结束了,这些新生赛太漫长了。不过这个也还是有些难度的,好多整不来。抓紧时间整理一下。 week1 第1周基本是古典密码,古典和现代最大的区别是古典全靠猜,现在都是数学 立正 wl hgrfhg 4gNUx4NgQgEUb4NC64NHxZLg636V6CDBi…...
 
vue3从基础到入门(一)
文章目录 简介提升使用创建脚手架vite 常用Composition APIsetuprefreactive函数响应式vue2响应式vue3实现响应式 reactive对比ref注意计算属性computed函数 监视watch函数watchEffect函数 生命周期hook函数toRef 简介 2020年9月18日,Vue.js发布3.0版本,…...
枚举类型 表示不同的 HTTP 状态码和相应的错误消息
java web业务中经常用常量来表示不同的 HTTP 响应状态,比如 public enum AppHttpCodeEnum {// 成功段0SUCCESS(200,"操作成功"),// 登录段1~50NEED_LOGIN(1,"需要登录后操作"),LOGIN_PASSWORD_ERROR(2,"密码错误"),// TOKEN50~100TOKEN_INVALID…...
 
SAP 使用cl_gui_timer自动刷新屏幕的用法详解 <转载>
原文链接:https://blog.csdn.net/SAPmatinal/article/details/130483382 SAP 使用cl_gui_timer自动刷新屏幕的用法详解 这个类在初始化的时候会设置一个定时间隔,每隔这个时间就会触发一次FINISHED事件。利用这个类的特性,可以实现很多东西&…...
 
golang中的Interface接口 类型断言、接口赋值、空接口的使用、接口嵌套
Interface整理 文章目录 Interface整理接口嵌套接口类型断言类型判断 type-switch使用方法集与接口空接口实例 接口赋值给接口 接口是一种契约,实现类型必须满足它,它描述了类型的行为,规定类型可以做什么。接口彻底将类型能做什么࿰…...
使用设计模式省去大量的if-elsef分支
1.测试类 Testpublic void test7() {/*** 使用设计模式前*///模拟入参String name "?";if("张三".equals(name)){System.out.println("按照张三的策略执行的任务!");}else if ("李四".equals(name)){System.out.println("按照李…...
 
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
 
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
 
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
 
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
 
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
 
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
