SIMATIC S7-200 SMART CPU CR20s, 紧凑型 CPU,AC/DC/继电器, 机载 I/O: 12 个数字输入端 24V DC;8 个数字输出端,继电器 2A; 电源:AC, 47 - 63Hz 时,85 - 264V AC, 程序存储器/数据存储器 20 KB
产品简介
详细介绍
西门子6ES7288-1CR20-0AA1经济型CPU模块
SIMATIC S7-200 SMART CPU CR20s, 紧凑型 CPU,AC/DC/继电器, 机载 I/O: 12 个数字输入端 24V DC;8 个数字输出端,继电器 2A; 电源:AC, 47 - 63Hz 时,85 - 264V AC, 程序存储器/数据存储器 20 KB
请相信上海励辉自动化科技有限公司是您忠诚的长久的合作伙伴,我们愿与广大客户携手向前,共同进步!
公司所备各类产品齐全,货量充足,能够满足客户对现货的需求,保证工程进度。
关于产品质量:本店产品均为西门子原装正品!如需详细产品资料、参数等信息可随时联系店主.产品质保期一年,
特殊停产备件质保六个月.本店一再强调正品,主要让亲们购买的时候心里更有底,大品牌原装的产品,在使用期限、使用效果、
以及售后服务更有保障。购买西门子原装正品,质保一年,西门子质保,您在使用产品之时没有后顾之忧。
关于快递:默认德邦快递 由于每个地方各快递到达速度不一样,如需快到达请您联系店主备注发货方式,如发顺丰快递加运费或者到付.
关于本店宗旨:诚信经营、客户至上.诚心为每一位用户提供西门子原装品质的产品 为每一用户提供便捷的西门子产品服务
本店承诺:凡在本店购买的西门子产品,若存在产品质量问题或与描述不符,本店支持7天无条件退货服务.产品为西门子*未开封。
本公司销售的产品一律为*正品 ;可以签约正式的销售合同,并可以开具16%的增值税发票、普通发票。如需发票,税点另算。拍前注意 均以报价为准。
产品质保期为一年!产品外包装详见产品图片,白色标签上均有西门子品牌LOGO及产品订货号,各位买家在收到货后,请核对型号无误,再拆包装(包装拆开后将无法二次销售,不支持退换货)
服务理念:
产品规格:原装正品,假一罚十。
产品质量:*,质保一年。
产品价格:薄利多销,量多从优。
产品货期:大量现货,付款发货。
西门子6ES7288-1CR20-0AA1经济型CPU模块
SIMATIC S7-200 SMART CPU CR20s, 紧凑型 CPU,AC/DC/继电器, 机载 I/O: 12 个数字输入端 24V DC;8 个数字输出端,继电器 2A; 电源:AC, 47 - 63Hz 时,85 - 264V AC, 程序存储器/数据存储器 20 KB
上海励辉自动化科技有限公司、是专业从事工业自动化控制系统、机电一体化装备系统集成和硬件维护的综合性企业。
本着“以人为本、科技先导、顾客满意、持续改进”的工作方针,致力于工业自动化控制领域的产品开发、工程配套和系统集成,拥有丰富的自动化产品的应用和实践经验以及雄厚的技术力量,为广大用户提供了SIEMENS的技术及自动控制的解决方案,
上海励辉公司在经营活动中精益求精,具备如下业务优势:
SIEMENS 可编程控制器
1、 SIMATIC S7 系列PLC、S7200、s71200、S7300、S7400、ET200
2、 逻辑控制模块 LOGO!230RC、230RCO、230RCL、24RC、24RCL等
3、 SITOP 系列直流电源 24V DC 1.3A、2.5A、3A、5A、10A、20A、40A
4、HMI 触摸屏TD200 TD400C TP177,MP277 MP377
SIEMENS 交、直流传动装置,数控伺服
S7-200 SMART,超越SMART
S7-200 SMART是西门子针对中国的OEM市场研发的新一代PLC。作为S7-200CN的升级产品,一方面继承了S7-200CN丰富的功能,另一方面融入了新的亮点,将全面覆盖并超越S7-200CN。从产品上市至今,S7-200 SMART在包装、纺织、机床、食品、橡塑等众多行业得到广泛应用,在提升设备性能和降低设备成本上发挥着重要作用。
SIMATIC S7-200 SMART 产品亮点
· 机型丰富,更多选择
提供不同类型、I/O点数丰富的CPU模块,单体I/O点数最高可达60点,可满足大部分小型自动化设备的控制需求。另外,CPU模块配备标准型和经济型供用户选择,对于不同的应用需求,产品配置更加灵活,最大限度的控制成本。
· 选件扩展,精确定制
新颖的信号板设计可扩展通信端口、数字量通道、模拟量通道。在不额外占用电控柜空间的前提下,信号板扩展能更加贴合用户的实际配置,提升产品的利用率,同时降低用户的扩展成本。
· 高速芯片,性能
配备西门子高速处理器芯片,基本指令执行时间可达0.15 μ s,在同级别小型PLC中*。一颗强有力的“芯”,能让您在应对繁琐的程序逻辑,复杂的工艺要求时表现的从容不迫。
· 以太互联,经济便捷
CPU模块本体标配以太网接口,集成了强大的以太网通信功能。一根普通的网线即可将程序下载到PLC中,方便快捷,省去了编辑电缆。通过以太网接口还可与其它CPU模块、触摸屏、计算机进行通信,轻松组网。
· 三轴脉冲,运动自如
CPU模块本体最多集成3路高速脉冲输出,频率高达100kHz,支持PWM/PTO输出方式以及多种运动模式,可自由设置运动包络。配以方便易用的向导设置功能,快速实现设备调整、定位等功能。
· 通用SD卡,快速更新
本机集成Micro SD卡插槽,使用市面上通用的Micro SD卡即可实现程序的更新和PLC固件升级,极大地方便了客户工程师对最终用户的服务支持,也省去了因PLC固件升级返厂服务的不便。
· 软件友好,编程高效
在继承西门子编程软件强大功能的基础上,融入了更多的人性化设计,如新颖的带状式菜单、全移动式界面窗口、方便的程序注释功能、强大的密码保护等。在体验强大功能的同时,大幅提高开发效率,缩短产品上市时间。
· *整合,无缝集成
SIMATICS7-200 SMART 可编程控制器,SIMATIC SMARTLINE触摸屏,SINAMICS V20变频器和SINAMICSV90伺服驱动系统*整合,为OEM客户带来高性价比的小型自动化解决方案,满足客户对于人机交互、控制、驱动等功能的*需求。
中央处理单元 CPU 订货号
· CPU SR20 标准型 CPU 模块,继电器输出,220 V AC 供电,12 输入/8 输出6ES7 288-1SR20-0AA0
· CPU ST20 标准型CPU模块,晶体管输出,24VDC供电,12输入/8输出6ES7 288-1ST20-0AA0
· CPU SR30 标准型CPU模块,继电器输出,220VAC供电,18输入/12输出6ES7 288-1SR30-0AA0
· CPU ST30 标准型CPU模块,晶体管输出,24VDC供电,18输入/12输出6ES7 288-1ST30-0AA0
· CPU SR40 标准型 CPU 模块,继电器输出,220 V AC 供电,24 输入/16 输出6ES7 288-1SR40-0AA0
· CPU ST40 标准型 CPU 模块,晶体管输出,24 V DC 供电,24 输入/16 输出6ES7 288-1ST40-0AA0
· CPU SR60 标准型 CPU 模块,继电器输出,220 V AC 供电,36 输入/24 输出6ES7 288-1SR60-0AA0
· CPU ST60 标准型 CPU 模块,晶体管输出,24 V DC 供电,36 输入/24 输出6ES7 288-1ST60-0AA0
· CPU CR40 经济型 CPU 模块,继电器输出,220 V AC 供电,24 输入/16 输出6ES7 288-1CR40-0AA0
· CPU CR60 经济型CPU模块,继电器输出,220VAC供电,36输入/24输出6ES7 288-1CR60-0AA0
· 扩展模块 EM 订货号
· EM DE08 数字量输入模块,8 x 24 V DC 输入6ES7 288-2DE08-0AA0
· EM DE16 数字量输入模块, 16×24 V DC 输入6ES7 288-2DE16-0AA0
· EM DR08 数字量输出模块,8 x 继电器输出6ES7 288-2DR08-0AA0
· EM DT08 数字量输出模块,8 x 24 V DC 输出6ES7 288-2DT08-0AA0
· EM QT16 数字量输出模块,16×24 V DC 输出6ES7 288-2QT16-0AA0
· EM QR16 数字量输出模块, 16×继电器输出6ES7 288-2QR16-0AA0
· EM DR16 数字量输入/输出模块,8 x 24 V DC 输入/8 x 继电器输出6ES7 288-2DR16-0AA0
· EM DR32 数字量输入/输出模块,16×24 V DC 输入/16 x 继电器输出6ES7 288-2DR32-0AA0
· EM DT16 数字量输入/输出模块,8 x 24 V DC 输入/8 x 24 V DC 输出6ES7 288-2DT16-0AA0
· EM DT32 数字量输入/输出模块,16 x 24 V DC 输入/16 x 24 V DC 输出6ES7 288-2DT32-0AA0
· EM AE04 模拟量输入模块,4 输入6ES7 288-3AE04-0AA0
· EM AE08 模拟量输入模块,8输入6ES7 288-3AE08-0AA0
· EM AQ02 模拟量输出模块,2 输出6ES7 288-3AQ02-0AA0
· EM AQ04 模拟量输出模块,4输出6ES7 288-3AQ04-0AA0
· EM AM03 模拟量输入/输出模块,2输入/1输出6ES7 288-3AM03-0AA0
· EM AM06 模拟量输入/输出模块,4 输入/2 输出6ES7 288-3AM06-0AA0
· EM AR02 热电阻输入模块,2 通道6ES7 288-3AR02-0AA0
· EM AR04 热电阻输入模块,4输入6ES7 288-3AR04-0AA0
· EM AT04 热电偶输入模块,4通道6ES7 288-3AT04-0AA0
· EM DP01 PROFIBUS-DP从站模块6ES7 288-7DP01-0AA0
· 信号板 SB 订货号
· SB CM01 通信信号板,RS485/RS232 6ES7 288-5CM01-0AA0
· SB DT04 数字量扩展信号板,2 x 24 V DC 输入/2 x 24 V DC 输出 6ES7 288-5DT04-0AA0
· SB AE01 模拟量扩展信号板,1×12位模拟量输入6ES7 288-5AE01-0AA0
· SB AQ01 模拟量扩展信号板,1 x 12 位模拟量输出6ES7 288-5AQ01-0AA0
· SB BA01 电池信号板,支持 CR1025 纽扣电池(电池单独购买) 6ES7 288-5BA01-0AA0
· 附件订货号
· I/O扩展电缆 S7-200 SMART I/O 扩展电缆,长度1米6ES7 288-6EC01-0AA0
· PM207 S7-200 SMART 配套电源,24 V DC/3 A 6ES7 288-0CD10-0AA0
· PM207 S7-200 SMART 配套电源,24 V DC/5 A 6ES7 288-0ED10-0AA0
· CSM1277 以太网交换机,4 端口6GK7 277-1AA00-0AA0
· SCALANCE XB005 以太网交换机,5端口6GK5 005-0BA00-1AB2
· SIMATIC HMI 订货数据
· SMART 700 IE V3 新一代SMART LINE触摸屏,7寸,64K色,集成以太网口,USB2.0 host接口,RTC,归档记录功能6AV6 648-0CC11-3AX0
· SMART 1000 IE V3 新一代SMART LINE触摸屏,10.2寸,64K色,集成以太网口,USB2.0 host接口,RTC,归档记录功能6AV6 648-0CE11-3AX0
· TD400C 蓝色背光LCD,4行文本显示器,可自定义前面板6AV6 640-0AA00-0AX0
一.需要的基础知识:
1. LINUX 设备驱动的基本结构。
2. 块设备驱动程序的基本构架(相信研究过 LDD3 当中的 sbull 的人应该都不成问题,如果只是走马观花的话,那可得好好再补补了)
3. LINUX 设备驱动模型。
二.驱动程序分析
首先,来明确一下我们需要分析的文件。下面的文件均来自 linux-2.6.24 源码,我们重点是分析驱动程序的基本构架,所以不同内核版本的差异并不是很大。 MMC/SD 卡驱动程序位于 drivers/mmc 目录下,我们只列出我们分析过程涉及到的几个文件:
Card/
block.c
queue.c/queue.h
core/
bus.c/bus.h
core.c/core.h
host.c/host.h
mmc.c
mmc_ops.c/mmc_ops.h 拿 MMC 卡来分析, SD 卡驱动程序流程类似。
host/
s3cmci.c/s3cmci.h 以 S3C24XX 的 MMC/SD 卡控制器为例,其它类型的控制器类似。
LINUX 当中对目录的划分是很有讲究的,这些文件被分布在 3 个目录下,正好对应 MMC/SD 驱动程序的 3 个层次(关于层的划分这里浏览一下,有个概念即可,当我们分析完了后再回头来看,你会觉得很形象):
(1) 区块层
主要是按照 LINUX 块设备驱动程序的框架实现一个卡的块设备驱动,这 block.c 当中我们可以看到写一个块设备驱动程序时需要的 block_device_operations 结构体变量的定义,其中有 open/release/request 函数的实现,而queue.c 则是对内核提供的请求队列的封装,我们暂时不用深入理解它,只需要知道一个块设备需要一个请求队列就可以了。
(2) 核心层
核心层封装了 MMC/SD 卡的命令,例如存储卡的识别,设置,读写。例如不管什么卡都应该有一些识别,设置,和读写的命令,这些流程都是必须要有的,只是具体对于不同的卡会有一些各自*的操作。 Core.c 文件是由sd.c 、 mmc.c 两个文件支撑的, core.c 把 MMC 卡、 SD 卡的共性抽象出来,它们的差别由 sd.c 和 sd_ops.c、 mmc.c 和 mmc_ops.c 来完成。
(3) 主机控制器层
主机控制器则是依赖于不同的平台的,例如 s3c2410 的卡控制器和 atmel 的卡控制器必定是不一样的,所以要针对不同的控制器来实现。以 s3cmci.c 为例,它首先要进行一些设置,例如中断函数注册,全能控制器等等。然后它会向 core 层注册一个主机( host ),用结构 mmc_host_ops 描述,这样核心层就可以拿着这个 host 来操作s3c24xx 的卡控制器了,而具体是 s3c24xx 的卡控制器还是 atmel 的卡控制器, core 层是不用知道的。
驱动程序层次图
好了,对这几个目录有一个大概认识以后,我们来看几个重要的数据结构:
struct mmc_host 用来描述卡控制器
struct mmc_card 用来描述卡
struct mmc_driver 用来描述 mmc 卡驱动
struct mmc_host_ops 用来描述卡控制器操作集,用于从主机控制器层向 core 层注册操作函数,从而将core 层与具体的主机控制器隔离。也就是说 core 要操作主机控制器,就用这个 ops 当中给的函数指针操作,不能直接调用具体主控制器的函数。
*阶段:
从 s3cmci_init 开始往下看
static int __init s3cmci_init(void)
{
platform_driver_register(&s3cmci_driver_2410);
}
有 platform_driver_register 函数,根据设备模型的知识,我们知道那一定会有对应的 platform_device_register函数的,可是在哪里呢?没有看到,那是不是这个 s3cmci_driver_2410 当中给的 probe 函数就不执行了???当然不是, mci 接口一般都是硬件做好的(我认为是这样),所以在系统启动时一定会有调用 platform_device?_register 对板上的资源进行注册,如果没有这个硬件资源,那我们这个驱动也就没有用了。好,我们就假定是有mci 接口的,而且也有与 s3cmci_driver_2410 对应的硬件资源注册了,那自己就会去跑 probe 函数。来看一下s3cmci_driver_2410:
static struct platform_driver s3cmci_driver_2410={
.driver.name ="s3c2410-sdi",
.probe =s3cmci_probe_2410,
.remove =s3cmci_remove,
.suspend =s3cmci_suspend,
.resume =s3cmci_resume,
};
我们到 s3cmci_probe_2410 函数中看,还是干脆直接看 s3cmci_probe 算了:
static int s3cmci_probe(struct platform_device *pdev, int is2440) // 来自 /host/s3cmci.c
{
struct mmc_host *mmc;
struct s3cmci_host *host;
int ret;
……
mmc= mmc_alloc_host (sizeof(struct s3cmci_host), &pdev->dev);
if (!mmc) {
ret=-ENOMEM;
goto probe_out;
}
……
mmc->ops =&s3cmci_ops;
……
ret= mmc_add_host (mmc);
if (ret) {
dev_err(&pdev->dev, "failed to add mmc ");
goto free_dmabuf;
}
……
platform_set_drvdata(pdev, mmc);
return 0;
……
}
这个函数很长,做的事件也很多,但我们关心的整个驱动的构架 / 流程,所以过滤掉一些细节的东西,只看 2 个最重要的函数: mmc_alloc_host 、 mmc_add_host 。函数命名已经很形象了,前者是申请一个 mmc_host ,而后者是添加一个 mmc_host 。中间还有一个操作,就是给 mmc 的 ops 成员赋上了 s3cmci_ops 这个值。申请mmc_host 当然很简单,就是申请一个结构体(我们暂且这样认为,因为他里面还做的其它事情,后面会看到),而添加又是添加到哪里去呢?看 mmc_add_host 函数:
int mmc_add_host(struct mmc_host *host) // 来自 core/host.c
{
int err;
……
err=device_add(&host->class_dev);
if (err)
return err;
mmc_start_host(host);
return 0;
}
很简单,就是增加了一个 device ,然后就调用 mmc_start_host 了,那就先跳过 device_add 这个动作,来看mmc_start_host:
void mmc_start_host(struct mmc_host *host) // 来自 /host/core.c
{
mmc_power_off(host); // 掉电一下
mmc_detect_change(host, 0); // ???
}
看上去只有两行代码,不过浓缩才是精华, mmc_power_off(host) 光看名子都知道是在干什么,先跳过,来看mmc_detect_change ,那么它到底干了些什么呢?看一下就知道了:
void mmc_detect_change(struct mmc_host *host, unsigned long delay) // core/core.c
{
mmc_schedule_delayed_work(&host->detect, delay);
}
static int mmc_schedule_delayed_work(struct delayed_work *work, unsigned long delay)
{
return queue_delayed_work(workqueue, work, delay);
}
mmc_detect_change 又跳了一下,最后调用了 queue_delayed_work ,不知道这个函数功能的去查一下<
struct mmc_host *mmc_alloc_host(int extra, struct device *dev) // 来自 core/host.c
{
struct mmc_host *host;
host=kzalloc(sizeof(struct mmc_host) + extra, GFP_KERNEL);
if (!host)
return NULL;
INIT_DELAYED_WORK(&host->detect, mmc_rescan);
return host;
}
如果你看了 queue_delayed_work 这个函数功能介绍,相信对 INIT_DELAYED_WORK 也不会陌生了吧。不废话了,来看 mmc_rescan :
// 来自 core/host.c
void mmc_rescan(struct work_struct *work) // // 来自 core/host.c
{
struct mmc_host *host= container_of(work, struct mmc_host, detect.work);
u32 ocr;
int err;
……
……
err=mmc_send_io_op_cond(host, 0, &ocr);
if (!err) {
if (mmc_attach_sdio(host, ocr))
mmc_power_off(host);
goto out;
}
err=mmc_send_app_op_cond(host, 0, &ocr);
if (!err) {
if (mmc_attach_sd(host, ocr))
mmc_power_off(host);
goto out;
}
err=mmc_send_op_cond(host, 0, &ocr);
if (!err) {
if (mmc_attach_mmc(host, ocr))
mmc_power_off(host);
goto out;
}
mmc_release_host(host);
mmc_power_off(host);
out:
if (host->caps & MMC_CAP_NEEDS_POLL)
mmc_schedule_delayed_work(&host->detect, HZ);
}
浏览一个这个函数,看看函数名,再看看注释,知道什么了吗?它是在检测是不是有卡插入了卡控制器,如果有卡挺入就要采取相应的行动了。这里要明白一点,我们平时用的 SD/MMC 卡就是一个卡,如果要操作它得用SD/MMC 卡控制器才行,所以可以看到有 struct mmc_card,struct mmc_host 的区分。
到这里了,来回忆一下 s3cmci_probe 这个函数做的事情,大概就是准备一个 mmc_host 结构,然后添加一个主控制器设备到内核,最后又调用了一下 mmc_rescan 来检测是不是有卡插入了。
如果有卡插入了还好,可以去操作卡了,那如果没有卡插入呢? mmc_rescan 不是白调用了一次吗?是啊,的确是白调用了一次。可是卡插入时为什么 PC 还是能检测到呢?看来卡检测的动作不光是在 probe 的最后一步做了一次,其它地方也有做。卡插入一般都是人为地随时去插入的,像这种情况一般都是会用中断机制去提供系统有外来侵入,然后再去采取行动。 SD/MMC 卡也的确是这样做的,找来找去,发现在 s3cmci_probe 里面注册了一个中断函数 s3cmci_irq_cd( 函数名的意思应该是 irq card detect) ,就是这个了,看看这个函数先:
static irqreturn_t s3cmci_irq_cd(int irq, void *dev_id) // host/s3cmci.c
{
struct s3cmci_host *host=(struct s3cmci_host *)dev_id;
mmc_detect_change(host->mmc, msecs_to_jiffies(500));
return IRQ_HANDLED;
}
看到这个函数想都不用想,直接跳到 mmc_rescan 里面去看就行了。前面已经知道了 mmc_rescan 里面就是在检测卡是不是插入了,既然卡随时插入我们都能检测到了,那就来看卡插入后都做了些什么动作吧。
第二阶段:
mmc_rescan 里面既要检测 sd 卡,又要检测 mmc 卡的,我们就照着一个往下走,假定有个人插入了 MMC卡,那就应该走下面这几行:
err=mmc_send_op_cond(host, 0, &ocr);
if (!err) {
if (mmc_attach_mmc(host, ocr))
mmc_power_off(host);
goto out;
}
mmc_send_op_cond 这个函数据说是读了一下卡的什么值,这个值是什么意义我也不清楚,这就像检测 FLASH时读 FLASH 的 ID 一样,网卡也是这样的,不用管这个值的意义了,只要知道它能标识是一个 MMC 卡插入就行了。如果取这个值没有错误的话就得进 mmc_attach_mmc 了:
int mmc_attach_mmc(struct mmc_host *host, u32 ocr) // core/mmc.c
{
int err;
……
mmc_attach_bus_ops(host); // 这个与总线的电源管理有关,暂时跳过
……
err=mmc_init_card(host, host->ocr, NULL);
if (err)
goto err;
……
mmc_release_host(host);
err=mmc_add_card(host->card);
if (err)
goto remove_card;
return 0;
remove_card:
……
err:
……
return err;
}
还是找几个关键函数来看 mmc_init_card 从函数名来看就是初始化一个 card ,这个 card 就用 struct mmc_card结构来描述,然后又调用 mmc_add_card 将卡设备添加到了内核,先来看 mmc_init_card 都做了些什么事情: