Modbus是一种常见的工业系统通讯协议。在我们的设计开发工作中经常使用到它。作为一种主从协议,在上一篇我们实现了Mobus RTU主站工具,接下来这一篇中我们将简单实现一个基于QT的Mobus RTU从站工具。
1、概述
Modbus RTU从站应用很常见,有一些是通用的,有一些是专用的。而这里我们希望实现一个主要针对我们的产品调试的Modbus RTU从站工具。 在开始软件设计之前,我们先来简略地分析一下,实现这样一个Modbus RTU从站工具包含的主要内容有哪些。我们认为软件需要如下几个方面的内容:
(1)、串口参数的配置
Modbus RTU通过串口来实现通讯,所以我们需要对串口相关的参数进行配置。我们希望串口号能够自动搜索,而相应的配置参数我们可以选择。 对串口的操作我们希望可以适应不同使用情况下的需求,让使用者可以自行选择串口名、波特率、校验位、数据位和停止位等,并控制串口的打开和关闭。
(2)、对数据的配置
数据的修改及更新,因为我们是从站实例,所以我们需要设置从站的参数类型和数量。我们将实现Modbus协议规定的4中数据类型:线圈、状态、输入寄存器和保持寄存器。 这四种数据其中线圈和状态是布尔量;输入寄存器和保持寄存器是16位整型量,这是指他的存储形式,事实上多个寄存器可以表示各种应用数据类型;线圈和保持寄存器支持读写;状态和输入寄存器位只读。
(3)、对主站的响应
对读从站数据,主要是指Modbus的功能码0x01、0x02、0x03和0x04等的处理。收到这几个功能码后,我们根据报文中的首地址和数量返回给主站即可。 对写从站数据,主要是指Modbus的功能码0x05、0x06、0x0F和0x10等的处理。对于这几个功能码,我们解析到这几个功能码后,根据指定的起始地址和数值对显影的变量值进行修改。
(4)、对信息的显示
接收信息的显示,作为调试工具,我们肯定希望能够一目了然地看到接收到目标设备发送过来的消息,所以我们需要一个显示区域来对接收的区域进行显示。 对数据的显示,我们在界面上设计各种数据类型的指示,线圈和状态使用CheckBox来显示其状态。当置位时现实为选中,复位时显示为不选中。而对于输入寄存器和保 持寄存器则可以直接显示它的数值。变量数据改变时则更新界面显示;同时界面状态改变时则更行变量数据。 运行状态的显示, 我们希望对操作的状态进行反馈以指示操作的动作是否执行,所以我们需要状态栏来实现这一需求。
2、界面设计
根据上一节中分析的需求,我们先来设计软件的界面。我们在QT中基于QMainWindow类生成一个操作界面,包括菜单栏、工具栏和状态栏以满足需求中对状态显示及操作命令的要求。 我们将上部区域设置为串口参数及Modbus RTU从站参数的配置于操作区域。而下面我们以5列17行的形式展示各种数据类型的数据状态。具体的界面设置如下图所示:
完成如上图的布局后,我们可以配置相应的参数,我们在程序初始化时配置好串口及Modbus RTU从站的默认参数。完成整个布局后我们先试着运行程序,正常运行则出现如下的界面:
上图就是完成布局后的运行界面,不过我们还没有实现相应的编码,所以目前还不能实现我们第一节中所提出来的功能。
3、编码实现
接下来这一小节,我们将来编码实现相应的功能。我们主要将功能分为参数设置与操作功能、数据的输入与发送功能以及数据的接收与显示功能三个部分来实现。
3.1、串口配置功能
对于参数的配置除了串口号以外,我们可以在程序中默认设置相应的参数,如果有必要可以修改,如果默认参数能满足要求亦可直接使用。至于串口号默认的不一定时我们所希望的,根据硬件配置情况选择即可。参数选定后我们只需要点击“连接”按钮即可实现Modbus RTU从站的连接。而连接操作的具体实现方式如下:
void MainWindow::on_pushButtonConnect_clicked()
{
bool intendToConnect = (modbusDevice->state() == QModbusDevice::UnconnectedState);
statusBar()->clearMessage();
if (intendToConnect)
{
modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter,ui->comboBoxPort->currentText());
modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter,QSerialPort::NoParity);
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,ui->comboBoxBaud->currentText().toInt());
modbusDevice->setConnectionParameter(QModbusDevice::SerialDataBitsParameter,QSerialPort::Data8);
modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter,QSerialPort::OneStop);
modbusDevice->setServerAddress(ui->spinBoxStation->text().toInt());
if (!modbusDevice->connectDevice())
{
statusBar()->showMessage(tr("连接失败: ") + modbusDevice->errorString(), 5000);
}
else
{
ui->pushButtonConnect->setEnabled(false);
ui->pushButtonDisconnect->setEnabled(true);
}
}
}
3.2、对界面操作的响应
首先我们在界面上操作各个类型的变量时,我们希望变量中的数据会跟随我们的操作而改变,并能被从站访问到。对于4种类型的数据将采用类似的处理方式。 对于线圈和状态量,当我们在界面上点击复选框改变选中状态时,会触发对应的槽函数,并肩对应的编号作为参数传递进去,槽函数会处理将Modbus RTU从站定义的变量状态改为和复选框的状态一致。具体实现如下:
void MainWindow::coilChanged(int id)
{
if(!modbusDevice)
{
return;
}
QAbstractButton *button = coilButtons.button(id);
if (!modbusDevice->setData(QModbusDataUnit::Coils, quint16(id), button->isChecked()))
{
statusBar()->showMessage(tr("Could not set data: ") + modbusDevice->errorString(), 5000);
}
}
void MainWindow::discreteInputChanged(int id)
{
if(!modbusDevice)
{
return;
}
QAbstractButton *button = discreteButtons.button(id);
if (!modbusDevice->setData(QModbusDataUnit::DiscreteInputs, quint16(id), button->isChecked()))
{
statusBar()->showMessage(tr("Could not set data: ") + modbusDevice->errorString(), 5000);
}
}
对于输入寄存器和保持寄存器在界面上使用的LineEdit来显示数据值,所以当我们改变LineEdit的内容时,让其触发槽函数。在槽函数中我们将Modbus RTU从站对应的寄存器的值改为和LineEdit的内容一样。具体实现如下:
void MainWindow::setInputRegister(const QString &value)
{
if(!modbusDevice)
{
return;
}
const QString objectName = QObject::sender()->objectName();
if(inputRegisters.contains(objectName))
{
bool ok = true;
const quint16 id = quint16(QObject::sender()->property("ID").toUInt());
if (objectName.startsWith(QStringLiteral("inReg")))
{
if(!modbusDevice->setData(QModbusDataUnit::InputRegisters, id, value.toUShort(&ok, 16)))
{
statusBar()->showMessage(tr("Could not set register: ") + modbusDevice->errorString(),5000);
}
}
}
}
void MainWindow::setHoldingRegister(const QString &value)
{
if(!modbusDevice)
{
return;
}
const QString objectName = QObject::sender()->objectName();
if(holdingRegisters.contains(objectName))
{
bool ok = true;
const quint16 id = quint16(QObject::sender()->property("ID").toUInt());
qDebug()<setData(QModbusDataUnit::HoldingRegisters, id, value.toUShort(&ok, 16)))
{
statusBar()->showMessage(tr("Could not set register: ") + modbusDevice->errorString(),5000);
}
}
}
}
经过上面的处理之后,到我们在界面上操作时就会更新到Modbus RTU从站对应的数据变量。
3.3、对主站设置的响应
当后台数据被修改时,需要修改显示数据。如主站修改了Coil或者HoldingRegister数据时,需要修改显示信息。而Modbus从站对象有3个信号,分别是:
void errorOccurred(QModbusDevice::Error error)
void stateChanged(QModbusDevice::State state)
void dataWritten(QModbusDataUnit::RegisterType table, int address, int size)
当主站访问从站时,则会在不同状态下触发相应信号函数,我们需要实现这三个信号函数对应的槽函数就可以实现相应的操作。具体实现如下:
//根据从站的变化更新数据显示
void MainWindow::UpdateDisplayBySlave(QModbusDataUnit::RegisterType table, int address, int size)
{
qDebug()<<"table:"<data(QModbusDataUnit::Coils, quint16(address + i), &value);
coilButtons.button(address + i)->setChecked(value);
break;
}
case QModbusDataUnit::HoldingRegisters:
{
modbusDevice->data(QModbusDataUnit::HoldingRegisters, quint16(address + i), &value);
qDebug()<setText(text.setNum(value, 16));
break;
}
default:
break;
}
}
}
//设备错误处理
void MainWindow::HandleDeviceError(QModbusDevice::Error newError)
{
if (newError == QModbusDevice::NoError || !modbusDevice)
return;
statusBar()->showMessage(modbusDevice->errorString(), 5000);
}
//从站状态改变响应
void MainWindow::SlaveStateChanged(int state)
{
bool connected = (state != QModbusDevice::UnconnectedState);
ui->pushButtonConnect->setEnabled(!connected);
ui->pushButtonDisconnect->setEnabled(connected);
}
4、测试验证
完成了编码调试后,我们来对开发的这一工具进行一些测试。首先我们安装一个虚拟串口软件用以虚拟我们用于测试的串口。我们还需要一个Modbus的主站应用来测试从站,这里我们选择Modscan来实现这一过程。 我们使用虚拟串口来模拟一对串口COM4和COM5。我们在ModScan中打开4个串口分别对应4中数据变量,数量都是16个,并将串口参数设置为和从站默认的一致,然后将其连接到COM5,如下图所示:
同时设置好从站的参数,然后将其连接到串口COM4,具体如下图:
这样从站和主站就连接上了。我们接下来在从站界面上操作,看看主站的数据变化。我们在从站界面上将线圈量的0、2、4、6、8、10、12、14等置位,并将状态量的1、3、5、7、9、11、13、15等置位,并在主站中查看,具体如下:
上图中我们可以看到主站显示的数据与从站设置的数据是一致的,说明我们的设计结果正确。接下来我们在从站界面上的输入寄存器的值修改0x01~0x10,同时在主站将保持寄存器的第10个修改为0x04,具体如下:
接下来我们在主站中修改保持寄存器的值,我们将保持寄存器的值修改为一系列不同的值,具体如下:
我们可以看到从站的显示数据与主站的设置是一致的。到此我们就完成了对Modbus RTU从站的测试,结果与我们设计的一致。
源码:https://gitee.com/ErichMoonan/modbus-slave
欢迎关注:
你可能感兴趣的:(应用软件,笔记,qt,系统架构)
Vue2+Vue3 130~180集学习笔记
Jyywww121
学习 笔记 vue.js
Vue2+Vue3130~180集(Vue3)学习笔记一、create-vue搭建vue3项目create-vue是vue官方新的脚手架工具,底层切换到了vite步骤:查看环境条件node-v版本需要在16.0及以上创建一个vue应用npminitvue@latest这一指令会安装并执行create-vue二、项目目录和关键文件index.html提供挂载点src/assets图片、样式文件的目录
微信小程序学习笔记(7)
。。。。。.....
微信小程序 前端
一、小程序API的3大分类①事件监听API特点:以on开头,用来监听某些事件的触发举例:wx.onWindowResize(functioncallback)监听窗口尺寸变化的事件②同步API特点1:以Sync结尾的API都是同步API特点2:同步API的执行结果,可以通过函数返回值直接获取,如果执行出错会抛出异常举例:wx.setStorageSync(‘key’,’value’)向本地存储中写
WPF学习笔记(17)样式Style
三千道应用题
WPF学习笔记 wpf
样式Style1.概述2Style详解3.Setter详解4Style用法5.EventSetter详解6EventSetterStyle用法总结1.概述样式(Style类)用于给控件定义外观,样式包含一个或多个Setter对象的集合,每个Setter由Property和Value组成。样式也是一种资源,可以像引用任何其他资源一样对其进行引用。官方文档:https://learn.microsof
WPF学习笔记(18)触发器Trigger
触发器1.概述2.详解2.1.Trigger用法2.2.MultiTrigger用法2.3.DataTrigger用法2.4.EventTrigger用法总结1.概述官方文档:https://learn.microsoft.com/zh-cn/dotnet/api/system.windows.trigger?view=netframework-4.82.详解在Style中可以指定触发器类型,触发
MQTT协议
bantinghy
MQTT c++ linux 服务器 ubuntu
MQTT协议历史背景ArlenNipper(当时在ArcomControlSystems)和IBM的AndyStanford-Clark在1999年初制定了MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输)的第一个版本。那随着物联网的应用,也把其中很重要的通信协议MQTT推到非常关键的位置。没有MQTT,也就没有物联网的快速发展。参考文献Hello工控-
实现进程单例运行的几种方法
蒙娜丽轩
这几天接手同事的一个代码,发现一个应用点击多次会弹出多个,但只有一个是真正在起作用;说到这里,感觉应该看下tasklist,究竟是启动了多个,还是其他的没被顶掉。当时忘了查了,只是仓促的打了补丁,现在贴下代码,做个笔记;有需要的同学可以直接拿去用:开发环境:Qt5.1.0高版本或许会出现小问题,没有测试过;在此之前,先谈一下思路;要实现单例,就需要知道目前进程的状态,如果存在,那么不允许同ID的p
【蓝牙】Linux Qt4查看已经配对的蓝牙信息
漫步企鹅
qt linux 蓝牙 配对
在Linux系统中使用Qt4查看已配对的蓝牙设备信息,可以基于DBus与BlueZ(Linux下的蓝牙协议栈)进行交互。以下是一个实现方案:1.引入必要的库和头文件确保项目中包含DBus相关的头文件,并链接QtDBus模块:cpp#include#include#include#include2.定义DBus常量用于连接BlueZ服务的DBus接口、服务名和路径:cpp#defineBLUEZ_D
2025年6月28和29日复习和预习(C++)
子豪-中国机器人
算法 java 数据结构 c++
学习笔记大纲一、预习部分:数组基础(一)核心知识点数组的创建:掌握一维数组的声明方式,如intarr[5];(创建一个包含5个整数的数组)。重点在于理解数组长度需为常量,且在声明时确定。数组的初始化:学会为数组赋值,例如intarr[]={1,2,3};,可省略数组长度,编译器根据初始化值自动确定。数组元素的访问:通过索引访问数组元素,索引从0开始,如arr[1]表示访问数组arr的第二个元素。(
JT808教程:设置/查询终端参数
REDISANT提供互联网与物联网开发测试套件#互联网与中间件:RedisAssistantZooKeeperAssistantKafkaAssistantRocketMQAssistantRabbitMQAssistantPulsarAssistantHBaseAssistantNoSqlAssistantEtcdAssistantGarnetAssistant工业与物联网:MQTTAssist
《48小时极速开发:Python+MySQL 学生信息管理系统架构实战揭秘》
Cyber4K
Python 项目实践及实战 python mysql 架构
Python项目实践:学生信息管理系统1.项目概述1.1项目背景开发周期:2天(需求分析0.5天+开发1天+测试0.5天)技术栈:Python3.9+MySQL+面向对象编程核心价值:实现学生信息的全生命周期管理采用分层架构设计(表示层/业务层/数据层)数据库驱动的高效数据持久化方案1.2系统架构系统架构调用CRUD操作连接池业务逻辑层命令行界面数据访问层MySQL数据库2.核心模块实现2.1数据
mac安装linux时触控板不能用,苹果笔记本安装Win10触摸板右键无法使用的处理方法...
旁间拓式
一位用户反馈自己在苹果笔记本MacBookair上安装了Windows10系统,可是后面发现触摸板右键根本无法使用,这是怎么回事呢?其实,这个是和苹果笔记本安装win7时的设置一样的,我们需要在BootCamp中进行设置。接下来,就随小编一起看看具体方法吧!方法如下:1、首先你确定已经安装过BootCamp,如果没有去苹果官方下载相应版本BootCamp下载(注意按机型下载)。如果已经安装过,那么
mac 触控板 右键
安果移不动
# mac
不知道你的APPLE笔记本是那个型号的,目前有两种情况~~~1,触摸板有按键的,这个就是两个手指头放在触摸板上,然后不离开的情况下再按下触摸板按键,就是右键了~~~~~2,新款没有按键,整个触摸板可以按下去的~~~~原理相同,只不过两个手指头同时把触摸板按下去就成了~~~~
2024.12.08学习笔记
kim_puppy
学习 笔记
目录1.数组练习1.1数组练习2.全排列的思路(运用到深搜)2.1全排列的思路(运用到深搜)1.数组练习1.1数组练习先是一个思路比较容易理清楚的数组问题,如下:美国数学家维纳(N.Wiener)智力早熟,一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:“我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。
『大模型笔记』KV缓存:Transformer中的内存使用!
AI大模型前沿研究
大模型笔记 缓存 transformer KVcache 大模型 LLM
『大模型笔记』KV缓存:Transformer中的内存使用!文章目录一.KV缓存:Transformer中的内存使用!1.1.介绍1.2.自注意力机制回顾1.3.KV缓存的工作原理1.4.内存使用和示例1.4.1.存储键值缓存需要多少内存1.4.2.Example:OPT-30B(300亿参数)四.参考文献进一步阅读:加速GPT-KV缓存:https://www.dipkumar.dev/beco
初学Spring AI 笔记
笑衬人心。
大模型学习 spring 人工智能 笔记
目录SpringAI简介依赖与环境配置基础概念集成OpenAI(或其他LLM提供商)Prompt模板引擎Embedding与向量数据库SpringAIChatClient使用SpringAI和LangChain对比常见问题与建议SpringAI简介SpringAI是Spring团队推出的人工智能集成框架,旨在简化AI模型(如OpenAI、HuggingFace、Mistral、AzureOpenA
RISC-V设计之Decoder的封装与函数(二)
RISC-V设计之封装与函数(SV)写在前面:今天去见了导师,他强烈要求我把设计中的decoder删去,去掉宏定义引入局部变量,使用封装的函数来取而代之。并在其他运算模块调用函数的返回值,提高代码简洁度和清晰度,避免全局变量污染环境,下面是根据导师的主页总结的设计笔记。-----2025/7/1示例代码:这个opcodes包是为一个简单的处理器设计的辅助模块,作用是封装指令解析相关的功能,供CPU
LLM大语言模型学习笔记(1)
Arixs666
大语言模型 语言模型 笔记 人工智能
1.概念大语言模型(LLM,LargeLanguageModel),也称大型语言模型,是一种旨在理解和生成人类语言的人工智能模型。LLM通常指包含数百亿(或更多)参数的语言模型,它们在海量的文本数据上进行训练,从而获得对语言深层次的理解。2.能力2.1涌现能力区分大语言模型(LLM)与以前的预训练语言模型(PLM)最显著的特征之一是它们的涌现能力。涌现能力是一种令人惊讶的能力,它在小型模型中不明显
大语言模型(LLM)笔记
笑衬人心。
大模型学习 语言模型 笔记 人工智能
一、什么是大语言模型(LLM)?LLM(LargeLanguageModel)是基于Transformer架构构建,并在海量文本语料上训练出的具备自然语言理解和生成能力的深度神经网络模型。其本质任务是**预测下一个token(词/字/符号)**的概率分布,但通过大规模参数和数据的支持,表现出类人智能的行为。二、核心架构:Transformer由Google在2017年提出,是目前LLM的主流架构。
Svelte学习笔记六:谈谈双向绑定的使用
月半叫做胖
Svelte 前端学习 svelte 前端 框架
表单元素的双向绑定1.input受控绑定使用bind关键字进行绑定,svelte通过bind关键字来完成类似v-model的双向绑定textcheckboxnumberrangeselectletquestions=[{id:1,text:'question1'},{id:2,text:'question2'},{id:3,text:'question3'}];letselected=1;{#ea
svelte笔记
艾小逗
web 笔记
svelte特性编译过程使用场景创建项目问题1:build报错基本语法响应式变量if语句for循环await加载数据Event组件通信父子组件跨组件通信storeslot插槽生命周期tickonMountonDestroySvelteKit与Svelte的区别项目结构路由+page+page.svelte+page.js/ts+error+layout+layout.sveltelayout.se
鸿蒙应用发布全解析:应用模块化的实践
操作系统内核探秘
操作系统内核揭秘 OS harmonyos 华为 ai
鸿蒙应用发布全解析:应用模块化的实践关键词:鸿蒙系统、应用模块化、分布式能力、原子化服务、应用发布、HarmonyOS、开发实践摘要:本文全面解析鸿蒙(HarmonyOS)应用发布的核心机制,重点探讨应用模块化设计在鸿蒙生态中的实践。文章从鸿蒙系统架构出发,深入分析模块化应用的设计原理、开发流程和发布策略,结合实际案例展示如何利用鸿蒙的分布式能力和原子化服务特性构建高效、灵活的应用架构。同时,本文
【深度学习|学习笔记】如何在深度学习中使用 正则化技术 进行模型压缩、稀疏建模和迁移学习调优?
努力毕业的小土博^_^
机器学习基础算法优质笔记2 深度学习 学习 笔记 迁移学习 人工智能 机器学习
【深度学习|学习笔记】如何在深度学习中使用正则化技术进行模型压缩、稀疏建模和迁移学习调优?【深度学习|学习笔记】如何在深度学习中使用正则化技术进行模型压缩、稀疏建模和迁移学习调优?文章目录【深度学习|学习笔记】如何在深度学习中使用正则化技术进行模型压缩、稀疏建模和迁移学习调优?✅一、使用正则化进行模型压缩(ModelCompression)目标:方法:L1正则化促使权重稀疏化代码示例:后续压缩步骤
Java高并发系统限流算法的应用
赵广陆
arithmetic java 算法 开发语言
目录1概述2计数器限流2.1概述2.2实现2.3结果分析2.4优缺点2.5应用3漏桶算法3.1概述3.2实现3.3结果分析3.4优缺点4令牌桶算法4.1概述4.2实现4.3结果分析4.4应用5滑动窗口5.1概述5.2实现5.3结果分析5.4应用想学习架构师构建流程请跳转:Java架构师系统架构设计1概述在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。限流可以认为服务降级的一种,限流是对
PHP学习笔记(十二)
访问控制(可见性)对属性或方法的访问控制(PHP7.1后支持常量),是通过在前面添加关键字public(公有)、protected、private来实现。公有的任意可见,受保护的可被自身及其子类和父类访问,私有的只能被其定义所在的类访问属性的访问控制类属性可以定义为public,private或者protected。在没有任何访问控制关键字的情况下,属性声明为public不对称属性可见性从PHP8
硬件工程师入门与进阶全攻略
攻城狮-鹏哥
单片机 单片机 stm32 dsp开发 fpga开发 51单片机 mcu 嵌入式硬件
一、硬件工程师成长阶段划分(一)能力成长四象限模型(二)成长阶段对照表阶段理论要求实践技能项目经验典型岗位入门期数电模电基础万用表/示波器使用简单电路焊接硬件助理工程师成长期单片机/嵌入式系统原理图设计/PCBLayout功能模块开发初级硬件工程师成熟期高速电路设计/EMC理论信号完整性分析完整产品硬件开发资深硬件工程师专家期前沿技术跟踪系统级方案设计复杂系统架构设计硬件系统工程师二、入门阶段:夯
第八章:LeRobot摄像头配置与应用指南
贾全
实战具身智能机器人 深度学习 人工智能 算法 机器学习 机器人
引言在机器人学习系统中,视觉感知是至关重要的组成部分。摄像头作为机器人的"眼睛",为系统提供环境信息,使机器人能够理解周围世界并做出相应的决策。LeRobot作为一个完整的机器人学习框架,提供了灵活且强大的摄像头支持系统,能够适配多种类型的摄像头设备。本章将详细介绍LeRobot的摄像头配置和使用方法,帮助读者掌握如何在机器人学习项目中有效地集成和使用视觉系统。8.1LeRobot摄像头系统架构L
青少年编程与数学 02-022 专业应用软件简介 02 计算机辅助设计(CAD)软件:AutoCAD
明月看潮生
编程与数学 第02阶段 青少年编程 应用软件 编程与数学 CAD
青少年编程与数学02-022专业应用软件简介02计算机辅助设计(CAD)软件:AutoCAD一、计算机辅助设计(CAD)概述(一)定义(二)CAD的优势(三)CAD的应用范围二、计算机辅助设计发展历程(一)起源阶段(20世纪50年代-60年代)(二)初步发展阶段(20世纪70年代)(三)成熟阶段(20世纪80年代-90年代)(四)拓展阶段(20世纪末-21世纪初)(五)智能化与集成化阶段(21世纪
青少年编程与数学 02-022 专业应用软件简介 05 三维工程设计软件:SolidWorks
明月看潮生
编程与数学 第02阶段 青少年编程 编程与数学 应用软件 工程设计 SolidWorks
青少年编程与数学02-022专业应用软件简介05三维工程设计软件:SolidWorks一、法国达索系统(DassaultSystèmes)公司简介(一)公司历史(二)公司发展(三)公司文化与价值观二、SolidWorks软件主要特色(一)直观的用户界面(二)强大的三维建模能力(三)全面的设计验证工具(四)高效的协作功能三、SolidWorks软件的核心功能(一)三维建模(二)装配设计(三)工程图生
第三届“传智杯”全国大学生IT技能大赛(初赛B组)
START_GAME
实战笔记
第三届“传智杯”全国大学生IT技能大赛(初赛B组)链接:https://www.luogu.com.cn/contest/38442#description也直接洛谷进入———————————————————————————————笔记:前三题不难。卡在第四题(提交了18次才过-_-),测试点二就是过不了。变量创建的位置改一下就过了,非常不明白为什么。虽然最后5题都过了,估计还是凉凉300+。T1
青少年编程与数学 02-022 专业应用软件简介 03 三维建模及动画软件:Autodesk Maya
明月看潮生
编程与数学 第02阶段 青少年编程 maya 编程与数学 应用软件 动画 三维建模
青少年编程与数学02-022专业应用软件简介03三维建模及动画软件:AutodeskMaya一、什么是三维建模二、什么是计算机动画三、三维建模及动画设计软件的发展历程(一)早期探索阶段(20世纪60年代-80年代)(二)初步发展阶段(20世纪80年代-90年代)(三)快速发展阶段(20世纪90年代-21世纪初)(四)多元化与整合阶段(21世纪初-至今)四、三维建模及动画设计软件主要产品(一)Aut
Java实现的基于模板的网页结构化信息精准抽取组件:HtmlExtractor
yangshangchuan
信息抽取 HtmlExtractor 精准抽取 信息采集
HtmlExtractor是一个Java实现的基于模板的网页结构化信息精准抽取组件,本身并不包含爬虫功能,但可被爬虫或其他程序调用以便更精准地对网页结构化信息进行抽取。
HtmlExtractor是为大规模分布式环境设计的,采用主从架构,主节点负责维护抽取规则,从节点向主节点请求抽取规则,当抽取规则发生变化,主节点主动通知从节点,从而能实现抽取规则变化之后的实时动态生效。
如
java编程思想 -- 多态
百合不是茶
java 多态详解
一: 向上转型和向下转型
面向对象中的转型只会发生在有继承关系的子类和父类中(接口的实现也包括在这里)。父类:人 子类:男人向上转型: Person p = new Man() ; //向上转型不需要强制类型转化向下转型: Man man =
[自动数据处理]稳扎稳打,逐步形成自有ADP系统体系
comsci
dp
对于国内的IT行业来讲,虽然我们已经有了"两弹一星",在局部领域形成了自己独有的技术特征,并初步摆脱了国外的控制...但是前面的路还很长....
首先是我们的自动数据处理系统还无法处理很多高级工程...中等规模的拓扑分析系统也没有完成,更加复杂的
storm 自定义 日志文件
商人shang
storm cluster logback
Storm中的日志级级别默认为INFO,并且,日志文件是根据worker号来进行区分的,这样,同一个log文件中的信息不一定是一个业务的,这样就会有以下两个需求出现:
1. 想要进行一些调试信息的输出
2. 调试信息或者业务日志信息想要输出到一些固定的文件中
不要怕,不要烦恼,其实Storm已经提供了这样的支持,可以通过自定义logback 下的 cluster.xml 来输
Extjs3 SpringMVC使用 @RequestBody 标签问题记录
21jhf
springMVC使用 @RequestBody(required = false) UserVO userInfo
传递json对象数据,往往会出现http 415,400,500等错误,总结一下需要使用ajax提交json数据才行,ajax提交使用proxy,参数为jsonData,不能为params;另外,需要设置Content-type属性为json,代码如下:
(由于使用了父类aaa
一些排错方法
文强chu
方法
1、java.lang.IllegalStateException: Class invariant violation
at org.apache.log4j.LogManager.getLoggerRepository(LogManager.java:199)at org.apache.log4j.LogManager.getLogger(LogManager.java:228)
at o
Swing中文件恢复我觉得很难
小桔子
swing
我那个草了!老大怎么回事,怎么做项目评估的?只会说相信你可以做的,试一下,有的是时间!
用java开发一个图文处理工具,类似word,任意位置插入、拖动、删除图片以及文本等。文本框、流程图等,数据保存数据库,其余可保存pdf格式。ok,姐姐千辛万苦,
php 文件操作
aichenglong
PHP 读取文件 写入文件
1 写入文件
@$fp=fopen("$DOCUMENT_ROOT/order.txt", "ab");
if(!$fp){
echo "open file error" ;
exit;
}
$outputstring="date:"." \t tire:".$tire."
MySQL的btree索引和hash索引的区别
AILIKES
数据结构 mysql 算法
Hash 索引结构的特殊性,其 检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。
可能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢
JAVA的抽象--- 接口 --实现
百合不是茶
抽象 接口 实现接口
//抽象 类 ,方法
//定义一个公共抽象的类 ,并在类中定义一个抽象的方法体
抽象的定义使用abstract
abstract class A 定义一个抽象类 例如:
//定义一个基类
public abstract class A{
//抽象类不能用来实例化,只能用来继承
//
JS变量作用域实例
bijian1013
作用域
<script>
var scope='hello';
function a(){
console.log(scope); //undefined
var scope='world';
console.log(scope); //world
console.log(b);
TDD实践(二)
bijian1013
java TDD
实践题目:分解质因数
Step1:
单元测试:
package com.bijian.study.factor.test;
import java.util.Arrays;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import com.bijian.
[MongoDB学习笔记一]MongoDB主从复制
bit1129
mongodb
MongoDB称为分布式数据库,主要原因是1.基于副本集的数据备份, 2.基于切片的数据扩容。副本集解决数据的读写性能问题,切片解决了MongoDB的数据扩容问题。
事实上,MongoDB提供了主从复制和副本复制两种备份方式,在MongoDB的主从复制和副本复制集群环境中,只有一台作为主服务器,另外一台或者多台服务器作为从服务器。 本文介绍MongoDB的主从复制模式,需要指明
【HBase五】Java API操作HBase
bit1129
hbase
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.ha
python调用zabbix api接口实时展示数据
ronin47
zabbix api接口来进行展示。经过思考之后,计划获取如下内容: 1、 获得认证密钥 2、 获取zabbix所有的主机组 3、 获取单个组下的所有主机 4、 获取某个主机下的所有监控项  
jsp取得绝对路径
byalias
绝对路径
在JavaWeb开发中,常使用绝对路径的方式来引入JavaScript和CSS文件,这样可以避免因为目录变动导致引入文件找不到的情况,常用的做法如下:
一、使用${pageContext.request.contextPath}
代码” ${pageContext.request.contextPath}”的作用是取出部署的应用程序名,这样不管如何部署,所用路径都是正确的。
Java定时任务调度:用ExecutorService取代Timer
bylijinnan
java
《Java并发编程实战》一书提到的用ExecutorService取代Java Timer有几个理由,我认为其中最重要的理由是:
如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。Timer线程并不捕获异常,所以 TimerTask抛出的未检查的异常会终止timer线程。这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了。此时,已经被
SQL 优化原则
chicony
sql
一、问题的提出
在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统
java 线程弹球小游戏
CrazyMizzz
java 游戏
最近java学到线程,于是做了一个线程弹球的小游戏,不过还没完善
这里是提纲
1.线程弹球游戏实现
1.实现界面需要使用哪些API类
JFrame
JPanel
JButton
FlowLayout
Graphics2D
Thread
Color
ActionListener
ActionEvent
MouseListener
Mouse
hadoop jps出现process information unavailable提示解决办法
daizj
hadoop jps
hadoop jps出现process information unavailable提示解决办法
jps时出现如下信息:
3019 -- process information unavailable3053 -- process information unavailable2985 -- process information unavailable2917 --
PHP图片水印缩放类实现
dcj3sjt126com
PHP
<?php
class Image{
private $path;
function __construct($path='./'){
$this->path=rtrim($path,'/').'/';
}
//水印函数,参数:背景图,水印图,位置,前缀,TMD透明度
public function water($b,$l,$pos
IOS控件学习:UILabel常用属性与用法
dcj3sjt126com
ios UILabel
参考网站:
http://shijue.me/show_text/521c396a8ddf876566000007
http://www.tuicool.com/articles/zquENb
http://blog.csdn.net/a451493485/article/details/9454695
http://wiki.eoe.cn/page/iOS_pptl_artile_281
完全手动建立maven骨架
eksliang
java eclipse Web
建一个 JAVA 项目 :
mvn archetype:create
-DgroupId=com.demo
-DartifactId=App
[-Dversion=0.0.1-SNAPSHOT]
[-Dpackaging=jar]
建一个 web 项目 :
mvn archetype:create
-DgroupId=com.demo
-DartifactId=web-a
配置清单
gengzg
配置
1、修改grub启动的内核版本
vi /boot/grub/grub.conf
将default 0改为1
拷贝mt7601Usta.ko到/lib文件夹
拷贝RT2870STA.dat到 /etc/Wireless/RT2870STA/文件夹
拷贝wifiscan到bin文件夹,chmod 775 /bin/wifiscan
拷贝wifiget.sh到bin文件夹,chm
Windows端口被占用处理方法
huqiji
windows
以下文章主要以80端口号为例,如果想知道其他的端口号也可以使用该方法..........................1、在windows下如何查看80端口占用情况?是被哪个进程占用?如何终止等. 这里主要是用到windows下的DOS工具,点击"开始"--"运行",输入&
开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 !
天梯梦
mobile
CKplayer,其全称为超酷flv播放器,它是一款用于网页上播放视频的软件,支持的格式有:http协议上的flv,f4v,mp4格式,同时支持rtmp视频流格 式播放,此播放器的特点在于用户可以自己定义播放器的风格,诸如播放/暂停按钮,静音按钮,全屏按钮都是以外部图片接口形式调用,用户根据自己的需要制作 出播放器风格所需要使用的各个按钮图片然后替换掉原始风格里相应的图片就可以制作出自己的风格了,
简单工厂设计模式
hm4123660
java 工厂设计模式 简单工厂模式
简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式。是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
maven笔记
zhb8015
maven
跳过测试阶段:
mvn package -DskipTests
临时性跳过测试代码的编译:
mvn package -Dmaven.test.skip=true
maven.test.skip同时控制maven-compiler-plugin和maven-surefire-plugin两个插件的行为,即跳过编译,又跳过测试。
指定测试类
mvn test
非mapreduce生成Hfile,然后导入hbase当中
Stark_Summer
map hbase reduce Hfile path实例
最近一个群友的boss让研究hbase,让hbase的入库速度达到5w+/s,这可愁死了,4台个人电脑组成的集群,多线程入库调了好久,速度也才1w左右,都没有达到理想的那种速度,然后就想到了这种方式,但是网上多是用mapreduce来实现入库,而现在的需求是实时入库,不生成文件了,所以就只能自己用代码实现了,但是网上查了很多资料都没有查到,最后在一个网友的指引下,看了源码,最后找到了生成Hfile
jsp web tomcat 编码问题
王新春
tomcat jsp pageEncode
今天配置jsp项目在tomcat上,windows上正常,而linux上显示乱码,最后定位原因为tomcat 的server.xml 文件的配置,添加 URIEncoding 属性:
<Connector port="8080" protocol="HTTP/1.1"
connectionTi