`

PostgreSQL启动过程中的那些事十六:启动进程二

阅读更多

 

       这节主要讨论启动进程到了 StartupXLOG 。根据情况,如果需要就排除系统故障引起的数据库不一致状态,做相应的 REDO UNDO ,然后创建一个检查点,把所有共享内存磁盘缓冲和提交数据缓冲写并文件同步到磁盘、把检查点插入 xlog 文件、更新控制文件,使数据库达到一种状态,设置共享内存中 XLogCtl ShmemVariableCache 等对象信息 ;如果不需要,就根据控制文件从 xlog 文件读取最后的检查点信息,设置共享内存中 XLogCtl ShmemVariableCache 等对象信息;启动完 XLOG ,启动进程完成使命,自己做了了断, postmaster 进程根据子进程结束信号响应句柄继续。

目前没有看到数据文件里记录了检查点,难道这个没有???

 

3

   先上个图

 


 

方法调用序列示意图

 

4

StartupXLog 方法的处理流程示意图

 

 

 

StartupXLog 流程示意图

 

数据库在什么情况下需要恢复。如果出现事务故障、系统故障或者介质故障时,数据库需要恢复。出现诸如运算溢出、死锁、违反完整性约束等事务故障时数据库在运行时可以通过强制回滚自行处理。 系统故障是主存数据丢失,未完成事务有些数据已写到物理数据库,此时数据库启动时需要事务回滚( UNDO/rollback )恢复。已完成事务有些或全部数据未写到物理数据库,此时数据库启动时需要重做( REDO )已提交事务。介质故障,需要从以前的备份做专门恢复。

话说 到了XLogStartup 方法,在这个方法里最主要的是根据情况判断是否需要恢复。如果不需要恢复,处理比较简单;如果需要恢复,根据不同状况做相应恢复。这儿这个状况就是判断系统是否在上次关闭时出现了系统故障。

XLogStartup 方法,先读取控制文件pg_control ControlFileData 数据结构,再看是否有恢复命令文件recovery.con f (判断是否是归档模式,如果归档模式,需要恢复的话,就是归档恢复),读取内容并 设置 InArchiveRecovery = true 并根据情况 如果是 hot standby 的从系统 设置 StandbyMode = true 。接着读时间线历史文件。 然后 把来自控制文件的恢复目标时间线 recoveryTargetTLI 和归档清楚命令 archive_cleanup_command 保存于共享内存中的 xlog 控制结构 XLogCtl 的相关成员里 以备其它进程查看。 接着 调用 read_backup_label 方法 看是否有备份标签文件 $PGDATA$/backup_label ,如果有, 从中取检查点记录位置赋给 checkPointLoc ,如果没有备份标签文件,把控制文件里的检查点位置赋给 checkPointLoc 。根据这个检查点位置指针 checkPointLoc xlog 文件中读这个检查点的 xlog 记录解析到检查点对象 checkpoint 。根据其自身位置指针和其记录的下一个 xlog 记录位置指针,或者控制文件记录的 数据库是否非正常关闭状态或 ControlFile->state != DB_SHUTDOWNED 者有无 recover.conf 文件, 判断是否需要恢复。

如果不需要恢复,更新控制文件的 state 等于 DB_IN_PRODUCTION time 等于系统当前时间。接着 设置共享内存里的 XLogCtl 的成员 Write.lastSegSwitchTime 为当前时间,根据控制文件初始化XLogCtl 的最后的检查点的 XID/epoch 再初始化共享内存里缓存变量结构 ShmemVariableCache latestCompletedXid 以备份事务 ID ShmemVariableCache->latestCompletedXid = ShmemVariableCache->nextXid 然后调用 RecoverPreparedTransactions() 扫描 pg_twophase 文件夹 重新为 准备 的事务加载共享内存状态。如果任何关键 GUC 参数改变了,在我们允许 backend 进程写 WAL 日志以前记录到日志。所有这些事搞定后,设置 xlogctl->SharedRecoveryInProgress = false 允许 backend 进程写 WAL 日志。然后退出启动进程,postmaster 进程响应子进程退出信号其它相关进程。

如果需要恢复。这儿要处理的是崩溃时刻未完成 事务已写入 物理数据库的事务(处理方法是 UNDO )和崩溃时刻已完成 事务未写入 物理数据库的事务(处理方法是 REDO )。

根据数据库的运行模式(有无起归档,有无 hot standby 。有 hot standby 时,其主系统恢复和启归档情况一样进行恢复,从系统单独处理),调用 ReadRecord 方法从不同地方读取 xlog 日志记录,调用 xlog 的资源管理器 xmgr 的相应资源的重放方法做恢复。恢复完成后剩余步骤和不需要恢复的情况一样,处理后续事宜。 然后退出启动进程,postmaster 进程响应子进程退出信号其它相关进程。略详细过程见“ XLogStartup 流程示意图”

相关主要结构见下面:

       控制文件的结构 ControlFileData 及检查点结构 CheckPoint 参见《 PostgreSQL 存储系统一:控制文件存储结构》。

XLog 日志文件相关结构参见《 PostgreSQL 存储系统二: REDOLOG 文件存储结构》。

 

VariableCache 是共享内存里用来跟踪OIDXID 分配状态的数据结构。由于历史原因,由不同的轻量锁LWLock 保护这个结构中不同的字段。

typedef struct VariableCacheData

{

    /* 这些字段由 OidGenLock 锁保护 */

    Oid         nextOid ;      /* next OID to assign */

    uint32      oidCount ;     /* OIDs available before must do XLOG work */

 

    /* 这些字段由 XidGenLock 锁保护 */

    TransactionId nextXid ;      /* next XID to assign */

 

    TransactionId oldestXid ; /* cluster-wide minimum datfrozenxid */

    TransactionId xidVacLimit ;  /* start forcing autovacuums here */

    TransactionId xidWarnLimit ; /* start complaining here */

    TransactionId xidStopLimit ; /* refuse to advance nextXid beyond here */

    TransactionId xidWrapLimit ; /* where the world ends */

    Oid         oldestXidDB ;  /* database with minimum datfrozenxid */

 

    /* 这些字段由 ProcArrayLock 锁保护 */

    TransactionId latestCompletedXid ;  /* newest XID that has committed or

                                     * aborted */

} VariableCacheData ;

 

typedef VariableCacheData * VariableCache ;

 

 

XLOG 的共享内存总状态

typedef struct XLogCtlData

{

    /* WALInsertLock 锁保护 */

    XLogCtlInsert Insert;

 

    /* info_lck 锁保护 */

    XLogwrtRqst LogwrtRqst;

    XLogwrtResult LogwrtResult;

    uint32     ckptXidEpoch; /* nextXID & epoch of latest checkpoint */

    TransactionId ckptXid;

    XLogRecPtr asyncXactLSN; /* LSN of newest async commit/abort */

    uint32     lastRemovedLog; /* latest removed/recycled XLOG segment */

    uint32     lastRemovedSeg;

 

    /* WALWriteLock 锁保护 */

    XLogCtlWrite Write;

 

    /* 尽管这些值可以变,但在启动后不再改变。是否可以读 / 写页面和块的值依赖于 WALInsertLock WALWriteLock */

    char       *pages;        /* buffers for unwritten XLOG pages */

    XLogRecPtr *xlblocks;       /* 1st byte ptr-s + XLOG_BLCKSZ */

    int         XLogCacheBlck;    /* highest allocated xlog buffer index */

    TimeLineID ThisTimeLineID;

    TimeLineID RecoveryTargetTLI;

 

    /* archiveCleanupCommand 是从 recovery.conf 文件里读的,但需要放在共享内存里以使 bgwriter 进程能访问它 */

    char        archiveCleanupCommand[MAXPGPATH];

 

    /* SharedRecoveryInProgress 指明本进程是否正在做崩溃或归档恢复。由

info_lck 锁保护 */

    bool       SharedRecoveryInProgress;

 

    /*

      * SharedHotStandbyActive 指明本进程是否正在做崩溃或归档恢复。由

info_lck 锁保护 */

    bool       SharedHotStandbyActive;

 

    /* 如果正在等 WAL 到达或者 failover 的触发器文件出现, recoveryWakeupLatch 用于唤醒启动将成继续重放 WAL */

    Latch      recoveryWakeupLatch;

 

    /* 在恢复期间,我们在这儿保存最后一个检查点的拷贝。当 bgwriter 想创建一个重启点 restartpoint 时由 bgwriter 进程使用。由 info_lck 锁保护。 */

    XLogRecPtr lastCheckPointRecPtr;

    CheckPoint lastCheckPoint;

 

    /* 最后一个检查点或被重放的检查点的结束位置加 1 */

    XLogRecPtr replayEndRecPtr;

    /* 被重放的最后一个记录的结束位置加 1 */

    XLogRecPtr recoveryLastRecPtr;

    /* 最后被重放的 COMMIT/ABORT 记录的时间戳 */

    TimestampTz recoveryLastXTime;

    /* 是否请求暂停恢复 ? */

    bool       recoveryPause;

 

    slock_t       info_lck;     /* locks shared variables shown above */

} XLogCtlData;

 

static XLogCtlData *XLogCtl = NULL;

 

/* XLogInsert 的共享状态数据结构 */

typedef struct XLogCtlInsert

{

    XLogwrtResult LogwrtResult; /* a recent value of LogwrtResult */

    XLogRecPtr PrevRecord;       /* start of previously-inserted record */

    int         curridx;      /* current block index in cache */

    XLogPageHeader currpage; /* points to header of block in cache */

    char       *currpos;      /* current insertion point in cache */

    XLogRecPtr RedoRecPtr;       /* current redo point for insertions */

    bool       forcePageWrites;  /* forcing full-page writes for PITR? */

 

    /* 如果在进程里备份由 pg_start_backup() 开始, exclusiveBackup true nonExclusiveBackups 是计数器,指明进程里当前基于流备份的数目。当上面两个任一个非 0 时(即有上面的备份时), forcePageWrites ture lastBackupStart 是最后一个检查点的 redo 值(下一个 xlog 记录的位置指针),作为在线备份的起始点。 */

    bool       exclusiveBackup;

    int         nonExclusiveBackups;

    XLogRecPtr lastBackupStart;

} XLogCtlInsert;

 

XLOG 控制的共享内存数据结构, LogwrtRqst 指出我们需要写 / 文件同步到日志的那个字节位置(在这个位置之前的所有记录必须被写或做文件同步)。 LogwrtResult 指出我们已经写 / 文件同步了的字节位置。

typedef struct XLogwrtRqst

{

    XLogRecPtr Write;        /* last byte + 1 to write out */

    XLogRecPtr Flush;        /* last byte + 1 to flush */

} XLogwrtRqst;

 

typedef struct XLogwrtResult

{

    XLogRecPtr Write;        /* last byte + 1 written out */

    XLogRecPtr Flush;        /* last byte + 1 flushed */

} XLogwrtResult;

 

指向 XLOG 里位置的指针。这个指针是 64 位,因为我们不想它有溢出的时候。

注意:用来指明一个无效的指针。这个没问题,因为我们在 XLOG 页头用了页头结构,因此 XLOG 记录不可能从页头开始。

注意:这儿容易引起理解错乱,这个 xlogid (对应实际 XLOG 文件名字的中间八位)表示逻辑 XLOG 日志文件 ID ,因为组成 XLOG 逻辑文件的实际物理文件远小于 4Gb 。组成对应这个 xlogid 的逻辑日志文件的每一个实际物理文件是一个 XLogSegSize 字节大小的“段”( "segment" ,段号是实际 XLOG 文件名字的后八位)。前面加上用八位表示的一个时间线 ID 、逻辑日志文件号和段号一起标识一个物理的 XLOG 日志文件(“段”)。段号和物理文件里的偏移量由 xrecoff/XLogSegSize xrecoff%XLogSegSize 计算。

typedef struct XLogRecPtr

{

    uint32      xlogid ;           /* log file #, 0 based */

    uint32      xrecoff ;      /* byte offset of location in log file */

} XLogRecPtr ;

 

/* XLogWrite/XLogFlush 的共享内存里的状态数据结构 */

typedef struct XLogCtlWrite

{

    XLogwrtResult LogwrtResult; /* current value of LogwrtResult */

    int         curridx;      /* cache index of next block to write */

    pg_time_t  lastSegSwitchTime;       /* time of last xlog segment switch */

} XLogCtlWrite;

 

/* 系统状态指示器。 */

typedef enum DBState

{

    DB_STARTUP = 0,

    DB_SHUTDOWNED ,

    DB_SHUTDOWNED_IN_RECOVERY ,

    DB_SHUTDOWNING ,

    DB_IN_CRASH_RECOVERY ,

    DB_IN_ARCHIVE_RECOVERY ,

    DB_IN_PRODUCTION

} DBState ;

 

XLogStartup 流程示意图中的两个红色方框红色字的框是 XLOG 资源管理器 xmgr 的处理方法,这个 XLOG 的资源管理器内容较多,单列主题讨论。还有恢复完成后调用了方法 CreateCheckPoint ,创建一个检查点 以将所有的恢复数据写到磁盘

 

5 创建检查点

创建一个检查点,会将共享内存里的所有磁盘缓冲和提交日志缓冲刷出并文件同步到磁盘。

下面这些情况可能引起创建检查点,为了使用方便,把这些情况定义成如下标志,这些标志可以按位做或运算。检查点的起因不同,创建检查点的行为也略有不同。

#define CHECKPOINT_IS_SHUTDOWN   0x0001 /* Checkpoint is for shutdown */

#define CHECKPOINT_END_OF_RECOVERY 0x0002     /* Like shutdown checkpoint,

                                            * but issued at end of WAL

                                            * recovery */

#define CHECKPOINT_IMMEDIATE    0x0004 /* Do it without delays */

#define CHECKPOINT_FORCE    0x0008 /* Force even if no activity */

/* These are important to RequestCheckpoint */

#define CHECKPOINT_WAIT         0x0010 /* Wait for completion */

/* These indicate the cause of a checkpoint request */

#define CHECKPOINT_CAUSE_XLOG   0x0020 /* XLOG consumption */

#define CHECKPOINT_CAUSE_TIME   0x0040 /* Elapsed time */

 

创建检查点的基本过程是先让存储管理器 smgr (以后单列状态讨论)为检查点做好准备, 根据情况填充检查点结构的成员,CheckpointGuts方法把共享内存里的磁盘缓冲和提交日志缓冲输出到磁盘(即写数据文件)。接着调用XlogInsert把这个检查点插入xlog文件。然后更新控制文件相关成员。最后更新共享内存里XlogCtl的检查点相关成员和检查点的统计信息结构。相关结构定义和创建检查点流程示意图见下面。

 

/* 检查点统计信息 */

typedef struct CheckpointStatsData

{

    TimestampTz ckpt_start_t ;   /* start of checkpoint */

    TimestampTz ckpt_write_t ;   /* start of flushing buffers */

    TimestampTz ckpt_sync_t ; /* start of fsyncs */

    TimestampTz ckpt_sync_end_t ;    /* end of fsyncs */

    TimestampTz ckpt_end_t ;     /* end of checkpoint */

 

    int         ckpt_bufs_written ;       /* # of buffers written */

 

    int         ckpt_segs_added ;  /* # of new xlog segments created */

    int         ckpt_segs_removed ;       /* # of xlog segments deleted */

    int         ckpt_segs_recycled ;      /* # of xlog segments recycled */

 

    int         ckpt_sync_rels ; /* # of relations synced */

    uint64      ckpt_longest_sync ;       /* Longest sync for one relation */

    uint64      ckpt_agg_sync_time ;      /* The sum of all the individual sync

                                     * times, which is not necessarily the

                                     * same as the total elapsed time for

                                      * the entire sync phase. */

} CheckpointStatsData ;

 

当前检查点的统计信息收集在这个全局结构变量里。

CheckpointStatsData CheckpointStats ;

 

 

创建检查点流程示意图

 

上图中,其中 CheckPointGuts 方法的定义见下面,刷出所有共享内存中的数据到磁盘并做文件同步。方法定义见下面,把 clog subtrans multixact predicate relationmap buffer (数据文件)和 twophase 相关数据统统刷和文件同步到磁盘。这儿先不深入讨论这个方法了。

static void

CheckPointGuts(XLogRecPtr checkPointRedo, int flags)

{

    CheckPointCLOG();

    CheckPointSUBTRANS();

    CheckPointMultiXact();

    CheckPointPredicate();

    CheckPointRelationMap();

    CheckPointBuffers(flags);   /* performs all required fsyncs */

    /* We deliberately delay 2PC checkpointing as long as possible */

    CheckPointTwoPhase(checkPointRedo);

}

 

结果这么多逻辑严谨的一系列行为后,数据库达到了正常状态,启动进程寿终正寝。然后, postmaster 进程响应该子进程退出,分别依次 fork bgwriter 进程、 walwriter 进程、 autovaclauncher 进程、 archiver 进程、 pgstat 进程,然后抛出一句 database system is ready to accept connections 。然后进入 serverloop ,等待客户端请求到达,启动 postgres 服务进程,开始履行使命。

Serverloop 还检查 bgwriter 进程、 walwriter 进程、 autovaclauncher 进程、 archiver 进程、 pgstat 进程,还有前面启动的系统日志进程 sysloger 这些辅助检查是否正常运行,如果没有,就重启这些进程。此时, pg 服务器端有 postmaster 进程和这六个辅助进程运行,准备好为客户端进程提供服务,提供的服务由 postgres 服务进程完成。

 

 

------------
转载请著明出处,来自博客:
blog.csdn.net/beiigang
beigang.iteye.com

 

  • 大小: 62.5 KB
  • 大小: 109.9 KB
  • 大小: 82.4 KB
0
0
分享到:
评论

相关推荐

    可商用版PHP个人逍遥商城系统源码 手机版+电脑版

    安装步骤: 1.逍遥商城系统需要PHP+mysql运行环境,可以在windows或linux下运行,具体的php和mysql的版本没有特殊要求,兼容范围还是比较广的,推荐php5.6以上,mysql5.0以上。 2.把文件夹所有文件解压缩在站点目录中, 2.执行http://127.0.0.1/install/index.php进行安装 3.安装完成后,把install目录删掉。

    wordpress可视化数据采集Scrapes插件,WP博客网站自动采集发布

    wordpress可视化数据采集Scrapes插件,WP博客网站自动采集发布 支持 PHP7.4,PHP8.0 及以上不支持 上传插件到 wp-content/plugins 目录,然后解压 不需要写采集规则,傻瓜式操作,只需要对方的网址域名,在后台动动鼠标即可。

    STM32F103使用NRF2401通过ACK响应双向通讯(HAL库)

    STM32F103使用NRF2401通过ACK响应双向通讯(HAL库) 简单的应用。

    libmodbus编译好的windows x86 版本的dll

    Libmodbus 是一个用于 Modbus 协议的开源库,提供了丰富的函数接口,可方便实现设备间的 Modbus 通信,支持多种平台,能轻松移植到不同系统中,有助于开发人员快速构建 Modbus 相关应用程序。我已编译好windows x86 版本的dll

    LabVIEW在汽车EPS转向器海纳传感器标定中的应用与优化

    内容概要:本文详细介绍了LabVIEW在汽车EPS转向器海纳传感器标定中的应用,重点探讨了如何通过LabVIEW解决传统标定方法中存在的数据采集实时性不足、标定过程缺乏自动化、数据分析难度大的问题。文中展示了具体的代码实现,包括数据采集、分析、校准和报告生成等功能模块,并通过实际案例展示了该系统的高效性和准确性。此外,文章还讨论了一些常见的调试问题及其解决方案,如通信握手逻辑、信号异常检测、温度补偿等。 适合人群:从事汽车电子、传感器标定及相关领域的工程师和技术人员。 使用场景及目标:适用于需要提高传感器标定效率和精度的企业和个人。目标是通过LabVIEW的应用,实现传感器标定的自动化和智能化,从而提升产品质量和生产效率。 其他说明:文章强调了LabVIEW在处理复杂标定任务中的灵活性和强大功能,提供了多个实用的技术细节和实践经验,对于希望深入了解LabVIEW在工业应用中的开发者非常有价值。

    嵌入式系统开发中Simulink If模块的DBC与硬件信号自动导入及代码生成技术

    内容概要:本文深入探讨了Simulink If模块在嵌入式系统开发中的强大功能,特别是在汽车电子和工业自动化领域的应用。主要介绍了两种核心技术:一是DBC文件的自动导入生成模型及代码,二是硬件信号的导入生成模型及代码。DBC文件的自动导入能够快速构建CAN总线通信模型,简化信号解析和报文处理,生成的代码可以直接应用于AUTOSAR架构,实现ASW和BSW的无缝对接。硬件信号导入功能则允许开发者轻松地将硬件设备产生的信号集成到Simulink模型中,自动生成带有滤波和其他预处理功能的代码,适用于实时数据采集和控制算法实现。 适合人群:从事嵌入式系统开发、汽车电子、工业自动化等相关领域的工程师和技术人员。 使用场景及目标:① 快速搭建基于DBC文件的CAN总线通信模型,提高开发效率;② 实现硬件信号的实时处理和控制,优化数据采集和信号处理流程;③ 自动生成符合AUTOSAR标准的高质量代码,减少手动编码错误。 其他说明:文中提供了多个Matlab代码示例,展示了具体的操作步骤和生成代码的结构,帮助读者更好地理解和应用这些功能。同时,文中还分享了一些实用技巧,如DBC文件的功能模块拆分、硬件信号的时间戳对齐以及代码生成的优化设置等。

    流变学仿真方法:流变学仿真参数设置.zip

    流变学仿真方法:流变学仿真参数设置.zip

    【算法设计与分析】基于动态规划的0-1背包问题求解:二维与一维滚动数组实现及应用

    内容概要:本文详细介绍了0-1背包问题的两种动态规划解法,包括二维DP数组和优化后的一维滚动DP数组方法。首先定义了最大物品数量和背包容量等常量,接着通过两个数组分别存储每个物品的重量和价值。文中给出的代码实现了完整的算法逻辑:初始化边界条件,迭代更新状态转移方程,最终计算出能够放入背包的最大价值。此外还提供了回溯功能,可以找出具体的最优解组合。为了提高空间效率,文章进一步解释了一维滚动数组的使用方法,并附有完整的C++代码实现。 适合人群:计算机科学专业学生或有一定编程基础、对算法设计与分析感兴趣的读者。 使用场景及目标:①学习经典的动态规划问题解决思路;②理解如何通过状态转移方程来优化复杂度;③掌握二维DP向一维DP转换的技术手段以节省内存开销。 阅读建议:建议读者先理解0-1背包问题的基本概念,再逐步深入研究两种不同的解法,注意对比两者之间的异同点,特别是空间复杂度方面的改进。同时可以通过修改输入数据来测试不同情况下的运行结果,加深对算法的理解。

    natsort-3.0.0.tar.gz

    该资源为natsort-3.0.0.tar.gz,欢迎下载使用哦!

    一维抛物热传导方程的数值解法及其MATLAB实现

    内容概要:本文详细介绍了求解一维抛物热传导方程的各种经典数值方法,包括显式欧拉法、隐式欧拉法、Crank-Nicolson格式(即梯形公式)、二阶BDF格式以及不同的差分格式(如五点差分、九点差分和紧差分)。每种方法不仅给出了理论公式的推导,还提供了完整的MATLAB源码实现,并附有详细的代码解释和数值例子的数据图解分析。通过对不同方法的比较,展示了它们在稳定性和精度方面的优劣。 适合人群:具备一定数学和编程基础的学生、科研人员及工程师。 使用场景及目标:适用于需要解决热传导问题的研究项目,帮助使用者理解并选择合适的数值方法进行仿真计算,优化求解过程。 其他说明:文中强调了边界条件处理的重要性,并建议初学者从简单的Dirichlet边界条件入手练习。此外,还提到了一些常见的陷阱,如MATLAB矩阵索引与物理空间坐标的错位问题,提醒开发者注意这些问题以确保正确性。

    一个人的经历信息和个人简介

    一个人的经历信息和个人简介

    三菱FX3U PLC圆弧插补程序解析及其在运动控制中的应用

    内容概要:本文详细介绍了三菱FX3U PLC的圆弧插补程序,涵盖从中断扫描初始化、U型插补主程序、移动控制函数到急停复位程序的具体实现方法。通过具体的代码示例,展示了如何利用U型插补指令和服务调用来实现精确的圆弧轨迹控制。此外,文中还讨论了插补过程中的一些关键技术点,如中断优先级设置、插补结果存储、角度参数设置以及误差补偿等。同时,提供了关于脉冲输出、坐标计算和方向控制的实际操作技巧,强调了脉冲当量换算的重要性,并分享了一些调试经验和注意事项。 适合人群:从事工业自动化、运动控制领域的工程师和技术人员,特别是那些对PLC编程有一定基础并希望深入了解三菱FX3U PLC圆弧插补功能的人群。 使用场景及目标:适用于需要进行高精度圆弧轨迹控制的应用场景,如CNC控制系统、机器人运动控制等。目标是帮助读者掌握三菱FX3U PLC的圆弧插补编程技能,提高其在实际项目中的应用能力。 其他说明:文中提供的程序实例不仅有助于理解三菱FX3U PLC的工作原理,还能作为实际项目的参考模板。建议读者在实践中不断优化和完善相关程序,以适应不同的应用场景。

    西门子200 Smart PLC在60吨/小时反渗透+混床纯水项目中的应用与优化

    内容概要:本文详细介绍了在一个60吨/小时的反渗透+混床纯水项目中,如何利用西门子200 Smart PLC和Smart Line触摸屏进行系统设计与优化。主要内容涵盖硬件架构搭建(如CPU SR40、AI模块、TM模块)、模拟量处理(如电导率、压力、流量等信号的采集与转换)、数据滤波(如滑动平均值算法)、时钟同步(如自动和手动校准)、用户权限管理(如多级权限设置)、报警处理(如状态位轮询和异或运算)以及混床再生控制(如PID指令和状态机编程)。此外,还涉及了一些实用技巧,如数据追溯功能、报警弹窗中的应急处置指引、隐藏的debug模式等。 适合人群:从事工业自动化控制领域的工程师和技术人员,尤其是熟悉西门子PLC和触摸屏编程的人群。 使用场景及目标:适用于需要深入了解和掌握西门子200 Smart PLC在水处理项目中的具体应用和优化方法的专业人士。目标是提高系统稳定性、可靠性和易用性,确保水处理过程高效、精准地运行。 其他说明:文中提供了大量具体的程序代码片段和实践经验分享,对于实际项目实施具有很高的参考价值。同时,作者强调了细节处理的重要性,如模拟量的精确转换、报警系统的完善设计等,这些都是保障系统正常运行的关键因素。

    WMware的mac版本

    找了一大圈终于找到了,有些e xing博主发的还有密码和要米,本资源真实可用

    matlab-配备MPPT(P & O)控制增压转换器的PMSG风力涡轮机仿真模型

    增压转换器和涡轮机的功率为1千瓦。它们适合风速高达12 m/s。涡轮机参考旋转速度150转/分

    卷积神经网络(CNN)项目源码-基于CNN的行为姿态识别代码

    卷积神经网络(CNN)项目源码-基于CNN的行为姿态识别代码

    jspm酒店客房预定管理系统.docx

    jspm酒店客房预定管理系统

    西门子博途HMI中基于SCL的高效IO状态监控与动态页面切换方案

    内容概要:本文详细介绍了如何利用西门子博途(TIA Portal)平台,在HMI(人机界面)中实现高效的IO状态监控和动态页面切换。主要内容包括:PLC端使用SCL语言创建结构化IO状态数组并进行动态更新;HMI端通过下拉菜单和动态绑定技术实现单页多设备IO状态的快速切换。文中还提供了具体的代码示例和技术细节,如符号寻址的应用、数组索引的注意事项以及常见的错误规避方法。 适合人群:从事工业自动化控制系统开发的技术人员,特别是熟悉西门子PLC编程和HMI开发的工程师。 使用场景及目标:适用于需要对多个设备或模块进行集中监控的工业现场,能够显著减少HMI画面制作时间和维护成本,提高系统的灵活性和可扩展性。 其他说明:文中提到的方法已在实际项目中得到验证,特别是在处理大量IO点的情况下表现出色。同时强调了良好的架构设计对于系统长期维护的重要性。

    MATLAB图像检索技术综述:词袋模型、颜色特征、形状特征、Hu不变矩及LBP纹理特征的应用

    内容概要:本文详细介绍了MATLAB在图像检索领域的多种方法和技术,包括词袋模型、颜色特征、形状特征、Hu不变矩和LBP纹理特征。通过具体的代码实例,展示了如何利用这些方法进行图像特征提取和相似度计算。词袋模型借鉴文本处理思想,通过SIFT特征和聚类构建视觉词典;颜色特征主要通过颜色直方图表示图像颜色分布;形状特征则利用Hu不变矩实现平移、旋转和尺度不变性;LBP纹理特征用于描述图像的局部纹理信息。每种方法都有其独特的应用场景和优势。 适合人群:从事图像处理、计算机视觉研究的技术人员,尤其是有一定MATLAB基础的研究人员和开发者。 使用场景及目标:适用于需要高效、精确图像检索的场合,如商品搜索、医学影像分析、安防监控等领域。通过掌握这些方法,能够提高图像检索的速度和准确性,满足不同业务需求。 其他说明:文中不仅提供了详细的理论解释,还附带了大量实用的MATLAB代码片段,帮助读者快速理解和应用这些技术。同时强调了在实际应用中选择合适特征组合的重要性,避免过度依赖单一算法。

    基于STC15W104单片机的2262/1527编码无线遥控解码与学习功能实现

    内容概要:本文详细介绍了如何使用STC15W104单片机实现2262/1527编码的无线遥控解码器。该解码器具备自动学习遥控器编码、掉电记忆数据以及四路输出控制的功能。硬件方面,P3.2连接315M接收模块,P5.4-P5.7作为输出接口,使用片内EEPROM进行数据存储。软件部分涵盖了定时器配置、中断处理、解码状态机的设计以及EEPROM的操作方法。文中还分享了一些实用的经验和注意事项,如接收模块的上拉电阻设置、学习模式的按键防抖处理等。 适合人群:具有一定单片机开发经验的技术人员,尤其是对无线遥控解码感兴趣的开发者。 使用场景及目标:适用于需要将传统2262/1527编码遥控器集成到智能家居系统或其他自动化控制系统中的场合。主要目标是提供一种低成本、高性能的解决方案,能够稳定可靠地解码并响应多种类型的遥控信号。 其他说明:文中提供了完整的代码片段和技术细节,帮助读者更好地理解和实现相关功能。此外,作者还提到了一些常见的陷阱和优化建议,有助于提高系统的稳定性和兼容性。

Global site tag (gtag.js) - Google Analytics