罗克韦尔AB PLC编程:移位指令在SLC500/MicroLogix中的应用

需积分: 31 3 下载量 166 浏览量 更新于2024-07-11 收藏 2.23MB PPT 举报
"该编程练习涉及使用AB PLC (SLC500/MicroLogix) 系统,要求实现一个程序,使O:001的初始二进制状态1111000000000000在前20秒内左移,后20秒内右移,如此循环。练习旨在熟悉移位指令的编程应用。" 在AB PLC编程中,移位指令是用于处理二进制数据流的关键指令,它们允许我们改变寄存器或数据存储区中二进制位的位置。在这个练习中,我们将关注两种基本的移位类型:循环左移(SHL)和循环右移(SHR)。 1. 循环左移(SHL)指令: 循环左移指令将二进制位向左移动指定的位数。最左边的位(最高位)会被移动到最右边(最低位),并替换原来的最低位。在AB PLC中,这通常通过使用SHL指令来实现。在本例中,每秒一次的频率意味着我们需要使用定时器来控制移位操作。 2. 循环右移(SHR)指令: 循环右移指令则相反,它将二进制位向右移动,最右边的位会移动到最左边,替换原来的最高位。同样,我们需要用SHR指令配合定时器来实现这一功能。 编程实现步骤可能如下: 1. 初始化:设置O:001为初始状态1111000000000000,并启动一个计时器(例如T:001)。 2. 前20秒左移阶段: - 当T:001的时间达到1秒时,执行SHL指令,将O:001的二进制位左移一位。 - 使用“重置”或“复位”指令(RST)清零T:001,然后重新启动定时器。 - 这个过程重复20次,使得O:001的所有位都左移过一次。 3. 后20秒右移阶段: - 在达到20秒后,改变条件,当T:001再次达到1秒时,执行SHR指令,将O:001的二进制位右移一位。 - 再次复位并重启定时器,重复这个过程20次。 4. 循环: - 在40秒结束后,重复上述过程,形成一个无限循环。 注意,AB PLC的SLC500系列和MicroLogix控制器提供了一系列的指令和模块来支持这种复杂的逻辑控制。SLC500主机使用1746系列I/O模块,而MicroLogix 1000则是一个固定型控制器,内置RS232通讯接口,适用于更简单的应用。 通过这个练习,我们可以深入了解如何在AB PLC系统中使用移位指令进行二进制数据的处理,以及如何结合定时器实现周期性操作。这对于理解PLC编程的基本逻辑和时间控制至关重要,对于工业自动化领域的工程师来说是非常重要的技能。

from pdb import set_trace as st import os import numpy as np import cv2 import argparse parser = argparse.ArgumentParser('create image pairs') parser.add_argument('--fold_A', dest='fold_A', help='input directory for image A', type=str, default='../dataset/50kshoes_edges') parser.add_argument('--fold_B', dest='fold_B', help='input directory for image B', type=str, default='../dataset/50kshoes_jpg') parser.add_argument('--fold_AB', dest='fold_AB', help='output directory', type=str, default='../dataset/test_AB') parser.add_argument('--num_imgs', dest='num_imgs', help='number of images',type=int, default=1000000) parser.add_argument('--use_AB', dest='use_AB', help='if true: (0001_A, 0001_B) to (0001_AB)',action='store_true') args = parser.parse_args() for arg in vars(args): print('[%s] = ' % arg, getattr(args, arg)) splits = os.listdir(args.fold_A) for sp in splits: img_fold_A = os.path.join(args.fold_A, sp) img_fold_B = os.path.join(args.fold_B, sp) img_list = os.listdir(img_fold_A) if args.use_AB: img_list = [img_path for img_path in img_list if '_A.' in img_path] num_imgs = min(args.num_imgs, len(img_list)) print('split = %s, use %d/%d images' % (sp, num_imgs, len(img_list))) img_fold_AB = os.path.join(args.fold_AB, sp) if not os.path.isdir(img_fold_AB): os.makedirs(img_fold_AB) print('split = %s, number of images = %d' % (sp, num_imgs)) for n in range(num_imgs): name_A = img_list[n] path_A = os.path.join(img_fold_A, name_A) if args.use_AB: name_B = name_A.replace('_A.', '_B.') else: name_B = name_A path_B = os.path.join(img_fold_B, name_B) if os.path.isfile(path_A) and os.path.isfile(path_B): name_AB = name_A if args.use_AB: name_AB = name_AB.replace('_A.', '.') # remove _A path_AB = os.path.join(img_fold_AB, name_AB) im_A = cv2.imread(path_A, cv2.IMREAD_COLOR) im_B = cv2.imread(path_B, cv2.IMREAD_COLOR) im_AB = np.concatenate([im_A, im_B], 1) cv2.imwrite(path_AB, im_AB),解释上述代码,并告诉我怎么设置文件夹格式

2023-06-10 上传