西门子s7协议
目录
西门子s7协议
西门子PLC数据类型
PLC中类型与C#对应类型
特殊说明:
S7协议帧结构
示例代码(C#访问PLC数据):
上位机和西门子PLC的通讯
西门子PLC的存储区
S7协议通讯网络模型
S7协议栈基于ISO/OSI模型,但主要实现以下4层:
S7协议的主要通信方式
s7协议通讯流程
COTP连接(第一次握手)报文
完整报文示例(Hex格式)
S7连接(第二次握手)报文
读取格式
关键差异说明
写入格式
关键差异说明
完整代码
西门子S7通信协议(S7 Communication Protocol)是西门子为其SIMATIC S7系列PLC(如S7-200、S7-300、S7-400、S7-1200、S7-1500)开发的一套工业自动化通信协议,主要用于PLC与HMI(人机界面)、SCADA系统、上位机(如PC)、其他PLC或工业设备之间的数据交换。
西门子s7协议
S7Comm(S7 Communication)是西门子专有的协议,是西门子S7通讯协议簇里的一种。
S7通信协议是西门子S7系列PLC内部集成的一种通信协议,是S7系列PLC的精髓所在。它是一种运行在传输层之上的(会话层/表示层/应用层)、经过特殊优化的通信协议,其信息传输可以基于MPI网络、PROFIBUS网络或者以太网S7在TCP连接上后还需要进行两次握手,S7协议的TCP/IP实现依赖于面向块的ISO传输服务。S7协议被封装在TPKT和ISO-COTP协议中,这使得PDU(协议数据单元) 能够通过TCP传送。
西门子PLC数据类型
PLC 数据类型
基本数据类型:包括位、位字符串、整数、浮点数、定时器、日期&时间、字符、数组和结构
PLC中类型与C#对应类型
PLC数据类型 (西门子) | C# 对应类型 | 存储大小 | 值范围 | 示例 |
---|---|---|---|---|
BOOL (位) | bool | 1 bit | true/false | I0.0, Q1.1 |
BYTE (字节) | byte | 8 bits | 0-255 | IB0 |
WORD (字) | ushort | 16 bits | 0-65535 | MW10 |
DWORD (双字) | uint | 32 bits | 0-4,294,967,295 | MD20 |
INT (短整数) | short | 16 bits | -32,768~32,767 | DB1.DBW0 |
DINT (双整数) | int | 32 bits | -2,147,483,648~2,147,483,647 | DB2.DBD4 |
USINT (无符号短整数) | byte | 8 bits | 0-255 | - |
UINT (无符号整数) | ushort | 16 bits | 0-65,535 | - |
UDINT (无符号双整数) | uint | 32 bits | 0-4,294,967,295 | - |
REAL (浮点数) | float | 32 bits | ±1.5×10⁻⁴⁵~±3.4×10³⁸ | DB3.DBD8 |
LREAL (长浮点数) | double | 64 bits | ±5.0×10⁻³²⁴~±1.7×10³⁰⁸ | DB4.DBD12 |
CHAR (字符) | char | 8 bits | ASCII字符 | 'A' |
STRING (字符串) | string | 可变长度 | 最大254字符 | "Hello" |
TIME (时间间隔) | TimeSpan | 32 bits | 0~2,147,483,647 ms | T#1D2H3M4S |
DATE_AND_TIME (日期时间) | DateTime | 64 bits | 1970-01-01~2106-02-07 | DT#2023-10-01-14:30:00 |
特殊说明:
-
PLC数组 → C#数组(如
REAL[10]
→float[]
) -
PLC结构体(STRUCT) → C#
class
或struct
-
TIME 类型在西门子PLC中以毫秒存储,C#用
TimeSpan
表示时间间隔 -
DATE_AND_TIME 在C#中对应完整的
DateTime
结构 -
字符串处理需注意:西门子STRING前2字节存储长度信息(如
[长度][最大长度][字符数据]
)
S7协议帧结构
1 TPKT 会话层 主要设置版本号 预留号 报文总长度
2 COPT 表示层 设置PDU类型
3 s7协议 应用层 设置协议头和协议参数等
示例代码(C#访问PLC数据):
// 使用S7.Net库读取不同类型数据
var plc = new Plc(CpuType.S71500, "192.168.1.10", 0, 1);
plc.Open();// 读取不同类型
bool boolVal = plc.Read("I0.0"); // BOOL
byte byteVal = plc.Read("MB0"); // BYTE
ushort wordVal = plc.Read("MW2"); // WORD
int intVal = plc.Read("DB1.DBW4"); // INT
float realVal = plc.Read("DB1.DBD8"); // REAL
DateTime dtVal = plc.Read("DB1.DBD12"); // DATE_AND_TIMEplc.Close();
上位机和西门子PLC的通讯
西门子PLC的存储区
-
I:输入
-
Q:输出
-
AI:模拟量输入
-
V/DB:变量存储区
可以使用modbus协议和s7协议和plc进行通讯,但是modbus协议只能请求上面四个区,西门子plc还有M:位区、T:定时器...
,使用S7协议可以操作所有的区
S7协议通讯网络模型
S7协议栈基于ISO/OSI模型,但主要实现以下4层:
-
物理层(第1层):
-
支持多种物理介质:RS485、工业以太网(PROFINET)、MPI等
-
典型传输速率:9.6Kbps-100Mbps(取决于具体实现)
-
-
数据链路层(第2层):
-
对于MPI/PROFIBUS网络使用西门子专有的第2层协议
-
对于PROFINET/工业以太网使用标准的IEEE 802.3协议
-
-
网络层(第3层):
-
使用西门子专有的网络层协议
-
处理设备寻址和路由
-
-
传输层(第4层):
-
使用西门子专有的传输协议
-
提供可靠的端到端数据传输
-
-
应用层(第7层):
-
S7通信协议本身
-
包含多种服务功能如读写变量、控制PLC等
-
S7协议的主要通信方式
-
S7基本通信:
-
用于简单的数据交换
-
基于OSI模型的第1-3层
-
-
S7通信(扩展通信):
-
更复杂的数据交换
-
基于OSI模型的第1-4层
-
提供更多服务功能
-
-
S7函数通信:
-
用于远程函数调用
-
基于OSI模型的完整7层
-
s7协议通讯流程
TCP三次握手(TCP连接时进行) => COTP连接(第一次握手连接) => S7连接(第二次握手) => 数据的读写
COTP连接(第一次握手)报文
字段分类 | 字段名称 | 字节位置 | 长度(字节) | 示例值(Hex) | 说明 |
---|---|---|---|---|---|
TPKT头部 | 版本号 | 0 | 1 | 0x03 | TPKT协议版本,固定为 0x03 |
保留位 | 1 | 1 | 0x00 | 保留字段,默认为0 | |
报文总长度 | 2-3 | 2 | 0x0016 | 整个报文长度(22字节) | |
COTP会话层 | COTP数据长度 | 4 | 1 | 0x11 | 后续COTP数据长度(17字 节) |
PDU类型 | 5 | 1 | 0xE0 | 0xE0表示连接请求(CR) | |
目标引用 | 6-7 | 2 | 0x0000 | 初始为0,由服务器分配 | |
源引用 | 8-9 | 2 | 0x0001 | 客户端生成的标识 | |
扩展格式 | 10 | 1 | 0x00 | 流控制标志(默认0) | |
COTP参数部分 | 源TSAP标识 | 11 | 1 | 0xC1 | 0xC1表示源TSAP(上位机) |
源TSAP长度 | 12 | 1 | 0x02 | 源TSAP参数长度(2字节) | |
源TSAP值 | 13-14 | 2 | 0x1000 | 连接模式:0x10(S7双边通信) | |
目标TSAP标识 | 15 | 1 | 0xC2 | 0xC2表示目标TSAP(PLC) | |
目标TSAP长度 | 16 | 1 | 0x02 | 目标TSAP参数长度(2字节) | |
目标TSAP值 | 17-18 | 2 | 0x0301 | 机架号0x03(0),槽 号0x01(1) | |
TPDU大小标识 | 19 | 1 | 0xC0 | 0xC0表示TPDU大小参数 | |
TPDU大小长度 | 20 | 1 | 0x01 | TPDU大小参数长度(1字节) | |
TPDU大小值 | 21 | 1 | 0x0A | 2^10=1024字节(最大传 输单元) |
完整报文示例(Hex格式)
03 00 00 16 11 E0 00 00 00 01 00 C1 02 10 00 C2 02 03 01 C0 01 0A
S7连接(第二次握手)报文
使用tcp五次握手链接
public partial class Form1 : Form
{public Form1(){InitializeComponent();}/// <summary>/// 五次握手/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button1_Click(object sender, EventArgs e){// s7协议// 1 需要通过socket三次握手,不用写握手过程// 目前提供设备型号s71200 cpu:1212c 电压是24vDCTcpClient client = new TcpClient();client.Connect("192.168.107.202",102); // 连接服务器receiveData(client);// 2 第一请求连接 发送请求帧为// 总共22个字节byte[] bs1 = new byte[]{0x03, // 1字节版本号 默认是030x00, // 1字节 保留值 默认00x00, 0x16, // 2 字节 报文的总长度0x11, // 1字节从该字节往后字节个数 十进制是170xE0, // PDU 类型0x00,0x00, // DST引用 默认值0x00,0x01, // src引用0x00, // 采用默认值0xc1, // 上位机擦书0x02, // 上位机长度0x10,0x00, // 0x01代表双边通信 0x00机架号和插槽号0xC2, // plc参数0x02, // 长度0x03,0x01, // 0x01和0x00 共同控制机架号和插槽0xC0,0x01,0x0a};client.GetStream().Write(bs1,0,bs1.Length); // 发送第一次请求帧 // 3 第二次请求连接 发送请求帧为bs1 = new byte[]{0x03, // 1字节版本号 默认是030x00, // 1字节 保留值 默认00x00, 0x19, // 2 字节 报文的总长度0x02, // 当前字节后的字节数0xF0, // PUD类型 数据传输0x80, // 最高是十进制1280x32, // 协议ID,固定值0x01, // 工作类型 0x01 主站发送请求0x00,0x00,0x00,0x00,0x00,0x08, // 参数长度0x00,0x00, // 数据长度0xF0, // 功能码0x00, // Reserved保留值0x00,0x03, // 允许操作最大工作队列0x00,0x03, 0x03,0xc0, // 允许处理最大字节数组};client.GetStream().Write(bs1,0,bs1.Length);MessageBox.Show("连接成功");}/// <summary>/// 接收响应数据集/// </summary>/// <param name="tcpClient"></param>public void receiveData(TcpClient tcpClient){Task.Run(() =>{byte[] bytes = new byte[1024];while (tcpClient.Connected){// ONEint count = tcpClient.GetStream().Read(bytes,0,bytes.Length);if (count == 0) return;Console.WriteLine(BitConverter.ToString(bytes, 0, count) + "\r\n");// TWObyte[] s = new byte[count];Array.Copy(bytes,s,count);Console.WriteLine(string.Join(",",s));}});}
}
读取格式
读取报文
关键差异说明
-
报文长度:
-
请求报文总长度为31字节(0x001F),响应报文为29字节(0x001D)。
-
-
ROSCTR字段:
-
请求报文为作业请求(0x01),响应报文为确认响应(0x03)。
-
-
数据长度:
-
请求报文数据长度为0(0x0000),响应报文为8字节(0x0008)。
-
-
返回数据:
-
响应报文包含实际读取的数据(0x000000-N),长度为32字节(0x0020)。
-
/// <summary>
/// 读取M区
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{// 发送请求帧 请求M区地址从00开始 读取一个数据// 读取数据时的请求帧byte[] data = new byte[] {// TPKT: 版本号 预留号 总字节长度0x03, // 版本号 0x00, // 预留号0x00,0x01F, // 总字节长度// COTP: 0x02, // 往下的长度0xF0, // PDU类型0x80, // 目标引用// s7-header s7头0x32, // 协议ID 默认0x01, // 主站开始发请求0x00,0x00, // 预留位置0x03,0x7b, // 随机生成的数字 每次在基础之上递增0x00,0x0e, // 参数长度0x00,0x00, // 数据长度// s7-参数部分0x04, // 功能码 读取功能 重点0x01, // 如果涉及多读时候 设置为1,0x12, // 结构表示 一般默认120x0a, // 往后的字节长度0x10, // 寻址模式0x02, // 读取的数据类型 02是字节类型0x00,0x01, // 读取长度 重点0x00,0x00, // 读取不是DB区 重点0x83, // 0x83 M存储区,0x84DB块 重点0x00,0x00,0x70, // 开始数据起始地址 重点// 列如M30000, 实际地址是30000*8=24 00000,把转成山歌字节,转成16进制3a980 对应三个地址,0x03,0xA9 0x80// 列如数据DB块的数据,DB21234,4000,其中DB号是21234 转成16进制0x52F2,DB区改为0x52,0xF2// 40000*8=,2000,转成16进制7d00 转成三个字节变成 0x00,0x7d,0x00};socket.Send(data);
}
收取数据响应
/// <summary>
/// 接收响应数据
/// </summary>
void startReceive()
{Task.Run(() =>{byte[] bytes = new byte[1024];while (true){int count = socket.Receive(bytes);if (count == 0) break;// 转为16进制的字符串Console.WriteLine("十六进制打印:"+BitConverter.ToString(bytes,0,count));// 转为十进制打印byte[] datas = new byte[count];Array.Copy(bytes,datas,count);Console.WriteLine("十进制打印:" + string.Join(",",datas));Invoke(new Action(() =>{try{this.label1.Text = datas[25].ToString();}catch (Exception ex){Console.WriteLine(ex);}}));/* 响应的数据* 连接的响应* 03-00-00-16-11-D0-00-01-00-08-00-C0-01-0A-C1-02-10-00-C2-02-03-01* 03-00-00-1B-02-F0-80-32-03-00-00-00-00-00-08-00-00-00-00-F0-00-00-03-00-03-00-F0* * 读取数据的响应* 03-00-00-1A-02-F0-80-32-03-00-00-03-7B-00-02-00-05-00-00-04-01-FF(读取成功的标志)-04(读取的数据类型)-00-08(数据的长度)-0C(数据)*/}});
}
写入格式
写入报文
关键差异说明
-
报文长度:
-
请求报文总长度为36字节(0x0024),响应报文为29字节(0x001D)。
-
-
功能码:
-
请求报文为写入操作(0x05),响应报文可能复用读取功能码(0x04)或应为写入响应(需确认协议规范)。
-
-
数据内容:
-
请求报文包含写入地址(0x000000)和数据(0xFF),响应报文返回操作状态和可能的回读数据。
-
数据写入
/// <summary>
/// 写入M14
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{byte[] value = BitConverter.GetBytes(uint.Parse(textBox1.Text));// 生成写的报文byte[] bs = new byte[]{// TPKT部分0x03, // 版本号0x00, // 预留号// 0x00,0x24, // 报文总长度360x00,0x27, // 报文总长度39// TOPT0x02, // 长度0xF0, // PDU类型0xB0, // 目标引用// s7 header0x32, // 协议id0x01, // 主站开始请求0x00,0x00, // 预留部分0x03,0x7d, // 随机生成0x00,0x0E, // 参数长度0x00,0x08, // 参数数据长度// s7 参数0x05, // 05代表写入,04代表读取0x01, // 通信项数 可以支持多写0x12, // 变量指定0x0A, // 后面的长度0x10,0x02, // 传输数据类型 字节// 0x00,0x01, // 操作数据的长度0x00,0x04, // 操作数据的长度0x00,0x00, // M区 不是DB区0x83, // M区// 0x00,0x00,0x70, // 开始写入的地址M140x00,0x3e,0x80, // 开始写入的地址M20000x00,0x04, // 字节类型// 0x00,0x80, // 写入的长度 8位=1字节0x00,0x20, // 写入的长度 8位=1字节 (写入4个数据 4*8=32转16进制为20)//byte.Parse(textBox1.Text)value[3],value[2],value[1],value[0]};tcp.Send(bs);Type = RequestType.Write;
}
完整代码
public partial class Form1 : Form
{TcpClientHelper tcp;public Form1(){InitializeComponent();}private void Tcp_OnClose(TcpClientHelper obj){MessageBox.Show("客户端关闭");}enum RequestType{Write, // 写入请求Read, // 读取请求Connect // 连接的请求}RequestType Type;private void Tcp_OnMessage(byte[] arg1, TcpClientHelper arg2){// 获取数据即可 自动触发BeginInvoke(new Action(() =>{switch (Type){case RequestType.Write:// 写入数据的响应Console.WriteLine("写入数据的响应"+BitConverter.ToString(arg1) );break;case RequestType.Read:// 读取数据的响应Console.WriteLine("读取数据的响应" + BitConverter.ToString(arg1));this.label1.Text = arg1[arg1.Length-1].ToString();break;case RequestType.Connect:Console.WriteLine("连接时的响应" + BitConverter.ToString(arg1));break;}}));}/// <summary>/// 写入M14/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button1_Click(object sender, EventArgs e){byte[] value = BitConverter.GetBytes(uint.Parse(textBox1.Text));// 生成写的报文byte[] bs = new byte[]{// TPKT部分0x03, // 版本号0x00, // 预留号// 0x00,0x24, // 报文总长度360x00,0x27, // 报文总长度39// TOPT0x02, // 长度0xF0, // PDU类型0xB0, // 目标引用// s7 header0x32, // 协议id0x01, // 主站开始请求0x00,0x00, // 预留部分0x03,0x7d, // 随机生成0x00,0x0E, // 参数长度0x00,0x08, // 参数数据长度// s7 参数0x05, // 05代表写入,04代表读取0x01, // 通信项数 可以支持多写0x12, // 变量指定0x0A, // 后面的长度0x10,0x02, // 传输数据类型 字节// 0x00,0x01, // 操作数据的长度0x00,0x04, // 操作数据的长度0x00,0x00, // M区 不是DB区0x83, // M区// 0x00,0x00,0x70, // 开始写入的地址M140x00,0x3e,0x80, // 开始写入的地址M20000x00,0x04, // 字节类型// 0x00,0x80, // 写入的长度 8位=1字节0x00,0x20, // 写入的长度 8位=1字节 (写入4个数据 4*8=32转16进制为20)//byte.Parse(textBox1.Text)value[3],value[2],value[1],value[0]};tcp.Send(bs);Type = RequestType.Write;}/// <summary>/// 读取M14/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button2_Click(object sender, EventArgs e){// 读取的报文31字节byte[] bs = new byte[]{0x03,0x00,0x00,0x1f,0x02,0xf0,0xb0,// 协议参数0x32,0x01,0x00,0x00,0x03,0x7d,0x00,0x0e,0x00,0x00, // 读取操作 为00x04,0x01,0x12,0x0a,0x10,0x02,//0x00,0x01, // 读取长度0x00,0x04, // M2000 读取四个字节0x00,0x00,0x83,// 0x00, 0x00,0x700x00,0x3e,0x80,};tcp.Send(bs);Type = RequestType.Read;}/// <summary>/// 连接/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form1_Load(object sender, EventArgs e){// 1 创建客户端对象tcp = new TcpClientHelper();tcp.Connect("192.168.107.202", 102); // 连接服务器// 2 获取数据tcp.OnMessage += Tcp_OnMessage;// 3 关闭连接tcp.OnClose += Tcp_OnClose;// 第一次连接请求byte[] bs = new byte[]{0x03, // 1字节版本号 默认是030x00, // 1字节 保留值 默认00x00, 0x16, // 2 字节 报文的总长度0x11, // 1字节从该字节往后字节个数 十进制是170xE0, // PDU 类型0x00,0x00, // DST引用 默认值0x00,0x01, // src引用0x00, // 采用默认值0xc1, // 上位机擦书0x02, // 上位机长度0x10,0x00, // 0x01代表双边通信 0x00机架号和插槽号0xC2, // plc参数0x02, // 长度0x03,0x01, // 0x01和0x00 共同控制机架号和插槽0xC0,0x01,0x0a};tcp.Send(bs);// 第二次请求连接bs = new byte[]{0x03, // 1字节版本号 默认是030x00, // 1字节 保留值 默认00x00, 0x19, // 2 字节 报文的总长度0x02, // 当前字节后的字节数0xF0, // PUD类型 数据传输0x80, // 最高是十进制1280x32, // 协议ID,固定值0x01, // 工作类型 0x01 主站发送请求0x00,0x00,0x00,0x00,0x00,0x08, // 参数长度0x00,0x00, // 数据长度0xF0, // 功能码0x00, // Reserved保留值0x00,0x03, // 允许操作最大工作队列0x00,0x03,0x03,0xc0, // 允许处理最大字节数组};tcp.Send(bs);Type = RequestType.Connect;MessageBox.Show("连接成功");}
}
本文部分借鉴于网络,如有侵权请联系删除!!!
相关文章:
西门子s7协议
目录 西门子s7协议 西门子PLC数据类型 PLC中类型与C#对应类型 特殊说明: S7协议帧结构 示例代码(C#访问PLC数据): 上位机和西门子PLC的通讯 西门子PLC的存储区 S7协议通讯网络模型 S7协议栈基于ISO/OSI模型,…...
面向对象——开闭原则(Open-Closed Principle, OCP)
开闭原则(Open-Closed Principle, OCP) 是面向对象设计中的重要原则之一,它的核心思想是: 对扩展开放(Open for extension):软件实体(类、模块、函数等)应该可以扩展&am…...
线程同步——读写锁
Linux——线程同步 读写锁 目录 一、基本概念 1.1 读写锁的基本概念 1.2 读写锁的优点 1.3 读写锁的实现 1.4 代码实现 一、基本概念 线程同步中的读写锁(Read-Write Lock),也常被称为共享-独占锁(Shared-Exclusive Lock&a…...
0.雷达信号
雷达信号 目录 1 常规脉冲信号 1 2 相位编码信号 2 3 线性调频信号 4 4 非线性调频信号 6 4.1 S型非线性调频信号 6 4.2 正弦调频信号 9 4.3 正切调频信号 10 5 噪声调幅干扰信号 11 6 噪声调频干扰信号 13 7 噪声调相干扰信号 15 1 常规脉冲信号 2 相位编码信号 …...
游戏引擎学习第189天
今天的回顾与计划 在昨天,我们花了一些时间来优化调试数据的收集方法,并且在调试界面中增加了一些界面代码,使得我们可以悬停在不同的元素上,查看相关信息。今天的任务是对这些数据进行更多的操作,进行一些有趣的实验…...
web3包含哪些关键技术栈,一些成功使用场景的分享
Web3的技术栈及其应用场景可归纳为以下六个核心模块,各模块均通过不同技术组合实现去中心化生态的构建: 一、关键技术栈及对应场景 区块链与共识机制 技术实现:以太坊、波场TRON等公链底层,结合PoW(工作量证明&am…...
uvm factory
UVM Factory 是验证环境中实现动态对象和组件创建的核心机制,它通过类型注册和覆盖(Override)机制,允许在不修改原有代码的情况下替换组件或事务类型,从而提升验证环境的灵活性和可重用性。以下是Factory机制的详细解析…...
MAC安装docker 后提示com.docker.vmnetd”将对您的电脑造成伤害
出现“com.docker.vmnetd”将对您的电脑造成伤害的提示,通常是由于文件签名问题导致 macOS 的安全系统误判 Docker 为恶意软件。以下是解决方法: 停止相关服务并删除文件 运行以下命令停止相关服务并删除有问题的文件 停止 Docker 服务 sudo pkill ‘…...
DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例7,TableView16_07 列拖拽排序示例
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例7,TableView16_07 列…...
爬虫的第三天——爬动态网页
一、基本概念 动态网页是指网页内容可以根据用户的操作或者预设条件而实时发生变化的网页。 特点: 用户交互:动态网页能够根据用户的请求而生成不同的内容。内容动态生成:数据来自数据库、API或用户输入。客户端动态渲染:浏览器…...
AI Agent 开发与传统后端开发区别?
AI Agent 开发与传统后端开发在目标、技术栈、设计模式和协作流程上存在显著差异。以下是详细对比: 一、核心目标不同 维度AI Agent 开发传统后端开发主要目标模拟人类决策、执行复杂任务处理业务逻辑、管理数据流用户交互主动感知环境、自主决策(如对话…...
python 将mkv格式视频转换成mp4格式
在Python中,可以使用moviepy库来将MKV格式的视频转换成MP4格式。moviepy是一个用于视频编辑的强大库,支持多种视频格式的处理。 from moviepy.editor import VideoFileClipdef convert_mkv_to_mp4(mkv_file_path, mp4_file_path):try:video VideoFileC…...
【入门初级篇】报表基础操作与功能介绍
【入门初级篇】报表的基本操作与功能介绍 视频要点 (1)报表组件的创建 (2)指标组件的使用:一级、二级指标操作演示 (3)表格属性设置介绍 (4)图表属性设置介绍 ࿰…...
单例模式在Python中的实现和应用
单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。它的应用场景非常广泛,比如配置管理、日志记录、线程池等领域。让我们一起深入了解一下Python中如何实现单例模式吧! 单例模式的基本概念 单例…...
HarmonyOS-ArkUI Navigation (导航组件)-第一部分
导航组件主要实现页面间以及组件内部的界面跳转,支持在不同的组件间进行参数的传递,提供灵活的跳转栈操作,从而便捷的实现对不同页面的访问和复用。 我们之前学习过Tabs组件,这个组件里面也有支持跳转的方式,Navigati…...
技术速递|为 .NET 的 AI 评估解锁新的可能性
作者:Wendy Breiding 排版:Alan Wang Microsoft.Extensions.AI.Evaluations 库旨在简化将 AI 评估流程集成到应用程序中的过程。它提供了一个强大的框架,用于评估您的 AI 应用程序并自动化评估其性能。 去年11月,我们发布了该库的…...
android studio调试aosp手机userdebug版本无法查看局部变量和参数问题如何解决?
背景: 平常系统开发过程中,经常需要对一些代码进行相关追踪,这个时候很多同学会使用马哥课程讲解的android studio直接进行调试的方法,但是近期有学员朋友在群里反馈它在调试过程中无法看到方法参数的值,局部变量值&a…...
【OCR】技术
OCR图像识别 一、OCR是什么二、Python中如何实现OCR1.简单应用 三、OCR的核心步骤1.图像预处理(提高识别准确率)2.文字识别3.输出结果 四、OCR到的应用场景五、注意事项六、扩展学习 此贴用来更新在工作中遇到的一些图片解析内容 一、OCR是什么 …...
数据库同步中间件PanguSync:如何跳过初始数据直接进行增量同步
某些用户在使用数据库同步中间件PanguSync时说,我不想进行初次的全量同步,我已经源备份还原到目标库了,两边初始数据一样,想跳过初始数据,直接进行增量同步,该怎么设置。 直接上干货,按如下步骤…...
ICLR 2025|华科OVTR:首次实现端到端开放词汇多目标跟踪,刷新性能SOTA!
OVTR 是一种新型的多目标跟踪(MOT)方法,它由华中科技大学的团队提出,并发表于 ICLR 2025。该方法不仅速度快、适应性强,还能在开放词汇场景下实现零样本跟踪。本文将从背景、创新点到实验细节,全面介绍 OVT…...
个人学习编程(3-29) leetcode刷题
最后一个单词的长度: 思路:跳过末尾的空格,可以从后向前遍历 然后再利用 while(i>0 && s[i] ! ) 可以得到字符串的长度, int lengthOfLastWord(char* s) {int length 0;int i strlen(s) - 1; //从字符串末尾开始//…...
JSP 与 JavaScript 动态网页开发的比较
本质区别 特性JSP (JavaServer Pages)JavaScript执行位置服务器端客户端(浏览器)主要功能生成HTML内容操作DOM、处理用户交互数据获取直接访问服务器资源(数据库等)需要通过AJAX/Fetch API获取SEO友好是(内容在服务器生成)否(内容可能由JS动态生成)首次加载完整HTML可能需要多…...
Vue下 Sortable 实现 table 列表字段可拖拽排序,显示隐藏组件开发
vue 开发table 列表时,需要动态调整列字段的顺序和显示隐藏 实现效果如图所示: vue 组件代码 <template><div style"width: 90%; margin: 0 auto;"><el-table :data"tableData" border"" ref"table…...
Apache Shiro 全面指南:从入门到高级应用
一、Shiro 概述与核心架构 1.1 什么是 Shiro? Apache Shiro 是一个强大且易用的 Java 安全框架,它提供了认证(Authentication)、授权(Authorization)、加密(Cryptography)和会话管…...
高速电路中的存储器应用与设计三
4 DDR2 SDRAM 介绍及其应用要点 1. DDR2 SDRAM 概述 DDR2(Double Data Rate 2,两倍数据速率,版本 2)SDRAM,是由 JEDEC 国际标准组织开发的、基于 DDR SDRAM 的、升级的存储技术。与 DDR SDRAM 相比,虽然其…...
AndroidStudio无法识别连接夜神模拟器
下载夜神模拟器: https://www.yeshen.com/ 启动之后发现AS关联不了夜神模拟器,需要做如下的操作。 1:复制配置文件进入夜神模拟器 adb 相关的更改: 开启的命令是: 端口启动 固定: 夜神模拟器ÿ…...
Go 语言标准库中database模块详细功能介绍与示例
Go语言的标准库 database/sql 提供了与 SQL 数据库交互的通用接口,但需要搭配具体的数据库驱动(如 MySQL、PostgreSQL 等)使用。以下是 database/sql 的核心方法及示例说明: 1. 连接数据库 sql.Open(driverName, dataSourceName)…...
ai-api-union项目,适配各AI厂商api
项目地址:alpbeta/ai-api-union 需求:实现兼容各大模型厂商api的流式对话和同步对话接口,本项目现兼容智谱、豆包、通义、通义版deepseek 设计 一个ChatController类对外暴露这两个接口,入参都为ChatRequest请求类,…...
进程间通信——信号量
进程间通信——信号量 目录 一、基本概念 1.1 概念 1.2 基本操作 1.3 相关函数 1.3.1 semget创建/获取 1.3.2 semop操作信号量 1.3.3 semctl初始化/删除 二、代码操作 2.1 不用PV的 2.2 用PV 的 2.2.1 a.c 2.2.2 b.c 2.2.3 sem.h 2.2.4 sem.c 一、基本概念 1.1…...
CSS 如何设置父元素的透明度而不影响子元素的透明度
CSS 如何设置父元素的透明度而不影响子元素的透明度 在 CSS 中,设置父元素的透明度(如通过 opacity 属性)会影响所有子元素的透明度,因为 opacity 是作用于整个元素及其内容的。如果想让父元素透明但不影响子元素的透明度&#x…...
SpringBean模块(一)定义如何创建生命周期
一、介绍 1、简介 在 Spring 框架中,Bean 是指由 Spring 容器 管理的 Java 对象。Spring 负责创建、配置和管理这些对象,并在应用程序运行时对它们进行依赖注入(Dependency Injection,DI)。 通俗地讲,Sp…...
2007-2019年各省地方财政一般公共服务支出数据
2007-2019年各省地方财政一般公共服务支出数据 1、时间:2007-2019年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区、年份、地方财政一般公共服务支出 4、范围:31省 5、指标说明:地方财政一般公共服务…...
S32K144外设实验(六):FTM输出单路PWM
文章目录 1. 概述1.1 时钟系统1.2 实验目的2. 代码的配置2.1 时钟配置2.2 FTM模块配置2.3 输出引脚配置2.4 API函数调用1. 概述 1.1 时钟系统 FTM的CPU接口时钟为SYS_CLK,在RUN模式下最高80MHz。模块的时钟结构如下图所示。 从上图中可以看出,FTM模块的功能时钟为SYS_CLK,…...
二层综合实验
拓扑图 实验要求 1.内网IP地址使用172.16.6.0/16分配 2.sw1和sW2之间互为备份 3.VRRP/STP/VLAN/Eth-trunk均使用 4.所有Pc均通过DHCP获取IP地址 5.ISP只能配置IP地址 6.所有电脑可以正常访问IsP路由器环回 实验思路 这是一个二层综合实验每当拿到一个实验看清楚要求之后都有…...
《深度剖析SQL之WHERE子句:数据过滤的艺术》
在当今数据驱动的时代,数据处理和分析能力已成为职场中至关重要的技能。SQL作为一种强大的结构化查询语言,在数据管理和分析领域占据着核心地位。而WHERE子句,作为SQL中用于数据过滤的关键组件,就像是一把精准的手术刀,…...
Python每日一题(7)
Python每日一题 2025.3.27 一、题目二、分析三、自己源代码四、deepseek答案五、源代码与ai分析 一、题目 question["""编写程序,生成包含20个随机数的列表,然后将前十个元素升序排列,后10个元素降序排列,并输出结果""" ]二、分析 今天本来写了…...
Linux命令大全:从入门到高效运维
适合人群:Linux新手 | 运维工程师 | 开发者 目录 一、Linux常用命令(每天必用) 1. 文件与目录操作 2. 文件内容查看与编辑 二、次常用命令(按需使用) 1. 系统管理与监控 2. 网络与通信 3. 权限与用户管理 三、…...
Xss复现
目录 前提: 1.什么是XSS 2.XSS 的三种主要类型 复现 第1关 第2关 前提: 1.什么是XSS XSS(跨站脚本攻击,Cross-Site Scripting) 是一种常见的 Web 安全漏洞,攻击者通过向网页注入恶意脚本ÿ…...
3.28学习总结
完成分割回文串的算法题,难点主要在如何去分割,靠什么去分割字符串 int a(char arr[]){int i,j;int lenstrlen(arr);for(i0,jlen-1;i<j;i,j--){if(arr[i]!arr[j]) return 0;}return 1;}char **path;int pathtop;char***reasult;int*ansize;int count…...
【MySQL基础】数据库及表基本操作
作为运维工程师,掌握MySQL的基础操作是日常工作的重要技能之一。本文将介绍MySQL中数据库和表的基本操作,帮助您快速上手或复习这些核心概念。 1 数据库基本操作 1.1 创建数据库 create database db_name; -- 指定字符集和排序规则 create database d…...
注意!ChatGPT 全新 AI 图像功能延迟对免费用户开放
2025 年 3 月 25 日,OpenAI 正式宣布在 ChatGPT 中推出基于 GPT-4o 模型的全新原生图像生成功能。 这一功能允许用户通过对话生成和编辑图像,支持从写实风格到插图风格的多种形式。OpenAI 首席执行官萨姆・奥特曼(Sam Altman)在社…...
玛哈特液压式精密矫平机——以精准压力,定义金属的绝对服从
板材应力不除,良率难升。液压式精密矫平机,凭借多级液压闭环技术AI动态补偿算法,攻克0.2mm超薄钛箔至65mm装甲钢板的矫平极限,平整度精度锁定0.012mm,残余应力≤3MPa,让金属从“形似平整”迈向“分子级稳定…...
HCIA【NAT】
目录 1 NAT产生背景 2 NAT作用 3 NAT分类 NAT(网络地址转换技术) 1 NAT技术产生背景 [1] IPV4地址不够用 [2] 处于IPV4到IPV6的一个过渡阶段,IPV6地址还没有完全普及 2 作用 [1] 解决IP地址不够用的问题 [2] 做公网和私网地址的转换 …...
Reactor 事件流 vs. Spring 事件 (ApplicationEvent)
Reactor 事件流 vs. Spring 事件 ApplicationEvent Reactor 事件流 vs. Spring 事件 (ApplicationEvent)1️⃣ 核心区别2️⃣ Spring 事件 (ApplicationEvent)✅ 示例:Spring 事件发布 & 监听1️⃣ 定义事件2️⃣ 发布事件3️⃣ 监听事件🔹 进阶&…...
Google开源机器学习框架TensorFlow探索更多ViT优化
一、在边缘设备优化ViTa 在边缘设备上优化 ViT(Vision Transformer)模型,主要目标是减少计算量、降低功耗、提升推理速度。以下是几种关键优化策略: 1.轻量级 ViT 变体 部分 ViT 变体专为边缘设备优化,包括…...
docker - compose up - d`命令解释,重复运行会覆盖原有容器吗
docker - compose up - d`命令解释,重复运行会覆盖原有容器吗 docker - compose up - d 是一个用于管理 Docker 容器的命令,具体含义如下: 命令含义: up:用于创建、启动并运行容器,会根据 docker - compose.yml 文件中定义的服务配置来操作。-d:表示以“分离模式”(det…...
火山dts迁移工具使用
登录后选择生态工具。(数据库传输服务DTS) 先选region 创建迁移任务 假设,mysql 选择专有网络(一般上云到火山都是专有网络) 【先选】结构迁移,全量,这些 【再选】迁移对象 (他们产研有bug,先…...
Tabby 一:如何在Mac配置保姆级教程(本地模型替换hugging face下载)
1. brew安装 mac需要先安装brew,如果本地已经安装过brew这一步可以忽略,遇到问题可以自己ai问 /bin/bash -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 可能遇到source .zprofile失败,因为…...
Go 语言标准库中time模块详细功能介绍与示例
以下是 Go 语言 time 模块的详细说明及示例,涵盖时间操作、定时器、时区处理等核心功能: 一、时间基础操作 1. 获取时间 // 当前本地时间 now : time.Now() fmt.Println(now) // 2023-08-04 15:30:45.123456 0800 CST// 构造指定时间 t : time.Date(20…...
做的一些实验
先在DRMPlane::Perform函数里,把PLANE_SET_SRC_RECT或者PLANE_SET_DST_RECT设置的DRMProperty::SRC_W DRMProperty::SRC_H或者DRMProperty::CRTC_W DRMProperty::CRTC_H设置为原来1/2,都无法启动Android界面。 后来思考了一下,Log里好像打印…...